#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define nMax 1001
#define pb push_back
#define INF 2000000000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, S, D, maxFlow;
int viz[nMax], tata[nMax], C[nMax][nMax];
vector<int> G[nMax];
queue<int> Q;
bool bfs()
{
memset(viz, 0, sizeof(viz));
viz[S]=1;
Q.push(S);
while(!Q.empty())
{
int node=Q.front();
Q.pop();
if(node==D)
continue;
for(vector<int>::iterator it=G[node].begin(); it!=G[node].end(); it++)
{
int fiu=*it;
if(C[node][fiu]==0 || viz[fiu])
continue;
tata[fiu]=node;
viz[fiu]=1;
Q.push(fiu);
}
}
return viz[D];
}
int main()
{
int a, b, c;
fin>>n>>m;
S=1, D=n;
for(int i=1; i<=m; i++)
{
fin>>a>>b>>c;
G[a].pb(b);
G[b].pb(a);
C[a][b]+=c;
}
while(bfs())
{
for(vector<int>::iterator it=G[D].begin(); it!=G[D].end(); it++)
{
int fiu=*it;
if(C[fiu][D]==0 || viz[fiu]==0)
continue;
tata[D]=fiu;
int Min=INF;
for(int aux=D; aux!=S; aux=tata[aux])
Min=min(Min, C[tata[aux]][aux]);
for(int aux=D; aux!=S; aux=tata[aux])
{
C[tata[aux]][aux]-=Min;
C[aux][tata[aux]]+=Min;
}
maxFlow+=Min;
}
}
fout<<maxFlow;
}