/*Dinic*/ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 210 #define inf 0x7fffffff using namespace std; int n,m,num,head[maxn],cur[maxn],dis[maxn]; struct node{ int u,v,flow,pre; }e[maxn*2]; void Add(int from,int to,int t){ e[num].u=from; e[num].v=to; e[num].flow=t; e[num].pre=head[from]; head[from]=num++; } void Init(){ scanf("%d%d",&m,&n); int u,v,t; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&t); Add(u,v,t);Add(v,u,0); } } bool Bfs(){ memset(dis,-1,sizeof(dis)); queue<int>q; q.push(1);dis[1]=0; while(!q.empty()){ int k=q.front();q.pop(); for(int i=head[k];i!=-1;i=e[i].pre){ int v=e[i].v; if(dis[v]!=-1||!e[i].flow)continue; q.push(v);dis[v]=dis[k]+1;; } } return dis[n]!=-1; } int Dfs(int now,int lim){ if(!lim||now==n)return lim; int r=0; for(int &i=cur[now];i!=-1;i=e[i].pre){ int v=e[i].v,s=0; if(dis[v]==dis[now]+1&&(s=Dfs(v,min(lim,e[i].flow)))){ e[i].flow-=s;r+=s; e[i^1].flow+=s;lim-=s; } if(lim==0)break; } return r; } void Dinic(){ int ans=0; while(Bfs()){ memcpy(cur,head,sizeof(head)); ans+=Dfs(1,0x7fffffff); } printf("%d ",ans); } int main() { Init(); Dinic(); return 0; }