#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+5; const int INF=0x7fffffff; typedef long long ll; int n,m,s,t; int head[MAXN<<1],tot; struct node { int to,nxt,flow,fir; }e[MAXN<<1]; void add(int x,int y,int z) { e[tot].fir=x;e[tot].to=y;e[tot].nxt=head[x];e[tot].flow=z;head[x]=tot++; } void add_edge(int x,int y,int z) { add(x,y,z);add(y,x,0); } int path[MAXN],tail,be,q[MAXN],f[MAXN]; int ek() { int ans=0; while(1) { memset(f,0,sizeof(f)); tail=0,be=0; q[++tail]=s; f[s]=INF; while(be!=tail) { int u=q[++be]; for(int i=head[u];~i;i=e[i].nxt) { int v=e[i].to; if(!f[v]&&e[i].flow) { path[v]=i; f[v]=min(f[u],e[i].flow); q[++tail]=v; } } if(f[t])break; } if(!f[t])break; for(int i=t;i!=s;i=e[path[i]].fir) { e[path[i]].flow-=f[t]; e[path[i]^1].flow+=f[t]; } ans+=f[t]; } return ans; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;i++) { int x,y,z;scanf("%d%d%d",&x,&y,&z); add_edge(x,y,z); } int ans=ek(); printf("%d ",ans); return 0; }