/*网络流最大流模板
输入:
点数n,边数m,起点s,终点t
m条边:起点,终点,最大流量
输出:
最大流*/
int ans;
int n,m,s,t;
struct Edge{
int to,next,value;
}e[maxn];int head[maxn],cntedge=1;
inline void addedge(int fr,int to,int value){
e[++cntedge]={to,head[fr],value};
head[fr]=cntedge;
}
int dis[maxn];
int bfs(){
for(int i=1;i<=n;i++)dis[i]=-1;
queue<int>q;
dis[s]=0;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(dis[v]==-1&&e[i].value>0){
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return dis[t]!=-1;
}
int dfs(int u,int exp){
if(u==t)return exp;
int flow=0,tmp=0;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(dis[v]==dis[u]+1&&e[i].value>0){
tmp=dfs(v,min(exp,e[i].value));
if(!tmp){dis[v]=0;continue;}
exp-=tmp;
flow+=tmp;
e[i].value -=tmp;
e[i^1].value +=tmp;
if(!exp)break;
}
}
return flow;
}
signed main(){
in(n);in(m);in(s);in(t);
for(int i=1,x,y,z;i<=m;++i){
in(x);in(y);in(z);
addedge(x,y,z);
addedge(y,x,-z);
}
while(bfs()){
ans+=dfs(s,inf);
}
o(ans);putchar('
');
}