#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
#define NMAX 1002
#define INF 200000000
int n,m,sol;
int t[NMAX],f[NMAX][NMAX],val[NMAX];
vector<int>v[NMAX];
struct nodc
{
int x,c;
}nod,fiu;
struct cmp
{
bool operator()(const nodc &a,const nodc &b)
{
return a.c>b.c;
}
};
priority_queue<nodc,vector<nodc>, cmp>q;
bool drum()
{
int i;
while(!q.empty())
q.pop();
memset(t,0,sizeof(t));
memset(val,0,sizeof(val));
t[1]=1;
val[1]=1;
nod.x=1;
nod.c=0;
q.push(nod);
while(!q.empty())
{
nod=q.top();
q.pop();
for(i=0;i<v[nod.x].size();++i)
{
fiu.x=v[nod.x][i];
if(f[fiu.x][nod.x] && !t[fiu.x] && (val[fiu.x]==0 || val[fiu.x]>val[nod.x]+1))
{
t[fiu.x]=nod.x;
val[fiu.x]=val[nod.x]+1;
if(fiu.x==n)
return 1;
q.push(fiu);
}
}
}
return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i,maxc,x,y,c;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back(y);
v[y].push_back(x);
f[y][x]=c;
}
while(drum())
{
maxc=INF;
for(i=n;i!=1;i=t[i])
if(f[i][t[i]]<maxc)
maxc=f[i][t[i]];
for(i=n;i!=1;i=t[i])
{
f[i][t[i]]-=maxc;
f[t[i]][i]+=maxc;
}
sol+=maxc;
}
printf("%d\n",sol);
return 0;
}