#include <algorithm>
#include <cstdio>
#include <cstring>
#define MP make_pair
#define PB push_back
#define W 1001
#include <vector>
using namespace std;
vector <int> G[1005];
vector <int> :: iterator it;
int c[W][W],f[W][W],i,n,m,t[W],q[W],p,u,nod,fluxminim,flow,x,y,cap;
inline bool BF()
{
memset(t,0,sizeof(t));
p=u=0;
q[p]=1;
while(p<=u)
{
nod=q[p];
for(it=G[nod].begin(); it!=G[nod].end(); ++it)
{
if(!t[*it] && c[nod][*it]>f[nod][*it])
{
t[*it]=nod;
q[++u]=*it;
if(*it==n) return 1;
}
}
p++;
}
return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=m; i++)
{
scanf("%d %d %d",&x,&y,&cap);
c[x][y]=cap;
G[x].PB(y);
G[y].PB(x);
}
flow=0;
int l;
while( BF())
{ for(it=G[n].begin(); it!=G[n].end(); ++it)
{
if(t[*it] && c[*it][n]>f[*it][n])
{ t[n]=*it;
fluxminim=1000000000;
i=n;
while(i!=1)
{
if (fluxminim>c[t[i]][i]-f[t[i]][i]) {fluxminim=c[t[i]][i]-f[t[i]][i]; }
i=t[i];
}
if(fluxminim<0) continue;
i=n;
while(i!=1)
{
f[t[i]][i]+=fluxminim;
f[i][t[i]]-=fluxminim;
i=t[i];
}
flow+=fluxminim;
}
}
}
printf("%d\n",flow);
return 0;
}