#include<cstdio>
#include<algorithm>
const int N=205,M=405,INF=0x3f3f3f;
int m,n;
int src,des,lev[N],cur[N];
int ecnt=1,adj[N],nxt[M],go[M],cap[M];
inline void addedge(const int &u,const int &v,const int &w)
{
nxt[++ecnt]=adj[u],adj[u]=ecnt,go[ecnt]=v,cap[ecnt]=w;
nxt[++ecnt]=adj[v],adj[v]=ecnt,go[ecnt]=u,cap[ecnt]=0;
}
inline bool bfs()
{
static int qn,que[N];
int u,v,e;
for(int i=src;i<=des;i++) lev[i]=-1,cur[i]=adj[i];
que[qn=1]=src;lev[src]=0;
for(int ql=1;ql<=qn;ql++)
{
u=que[ql];
for(e=adj[u];e;e=nxt[e])
{
if(cap[e]>0&&lev[v=go[e]]==-1)
{
lev[v]=lev[u]+1;
que[++qn]=v;
if(v==des) return true;
}
}
}
return false;
}
inline int dinic(const int &u,const int &flow)
{
if(u==des) return flow;
int res=0,v,delta;
for(int &e=cur[u];e;e=nxt[e])
{
if(cap[e]>0&&lev[u]<lev[v=go[e]])
{
delta=dinic(v,std::min(cap[e],flow-res));
if(delta)
{
cap[e]-=delta;cap[e^1]+=delta;
res+=delta; if(res==flow) break;
}
}
}
if(res!=flow) lev[u]=-1;
return res;
}
inline int maxflow()
{
int ans=0;
while(bfs()) ans+=dinic(src,INF);
return ans;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
ecnt=1;
for(int i=1;i<=n;i++) adj[i]=0;
src=1,des=n;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
printf("%d\n",maxflow());
}
return 0;
}