#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=1100, inf=1<<30;
int pre[N], map[N][N];
int n,m;
bool vis[N];
struct node{
int x,val;
node() {}
node(int a, int b): x(a), val(b) {}
};
int min(int a, int b){
return a<b?a:b;
}
int bfs()
{
queue<node> v;
node cur;
v.push( node(1,inf) );
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
vis[1]=1;
while(!v.empty())
{
cur=v.front(); v.pop();
if(cur.x==n) break;
for(int i=1;i<=n;i++)
if( map[cur.x][i] && !vis[i])
{
v.push( node(i, min(cur.val, map[cur.x][i])) );
pre[i]=cur.x; vis[i]=1;
}
}
if(cur.x==n && cur.x!=1) return cur.val;
else return -1;
}
int EK()
{
int next,res,flow,ans;
ans=0;
while( (flow=bfs())!=-1 )
{
next=n;
while(next!=1)
{
res=pre[next];
map[res][next]-=flow;
map[next][res]+=flow;
next=res;
}
ans+=flow;
}
return ans;
}
int main()
{
// freopen("in","r",stdin);
// freopen("out","w",stdout);
int i,a,b,c;
while(~scanf("%d%d",&m,&n))
{
memset(map,0,sizeof(map));
while(m--)
{
scanf("%d %d %d", &a, &b, &c);
map[a][b]+=c;
}
printf("%d\n", EK());
}
return 0;
}