#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 210
#define maxm 10010
#define ll long long
using namespace std;
ll n,m,s,t,head[maxn],to[maxm],nxt[maxm],cap[maxm],cnt=1,vis[maxn],dep[maxn],ans;
queue<ll> q;
void con(ll u,ll v,ll c){
to[++cnt]=v;
cap[cnt]=c;
nxt[cnt]=head[u];
head[u]=cnt;
}
void add(ll u,ll v,ll c){
con(u,v,c);
con(v,u,0);
}
bool bfs(){
memset(dep,0,sizeof(dep));
memset(vis,0,sizeof(vis));
q.push(s);
dep[s]=1;
while(!q.empty()){
ll f=q.front();
q.pop();
for(int i=head[f];i;i=nxt[i]){
ll ti=to[i];
if(dep[ti] || !cap[i])
continue;
dep[ti]=dep[f]+1;
q.push(ti);
}
}
return dep[t];
}
ll dfs(ll x,ll flow){
ll maxf=0,rest=flow;
vis[x]=1;
if(x==t){
ans+=flow;
return flow;
}
for(int i=head[x];i;i=nxt[i]){
ll ti=to[i],res=0;
if(!cap[i] || vis[ti])
continue;
if(!vis[ti] && cap[i] && dep[ti]==dep[x]+1){
res=dfs(ti,min(cap[i],rest));
if(res){
cap[i]-=res;
cap[i^1]+=res;
maxf+=res;
rest-=res;
}
}
}
return maxf;
}
int main(){
scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
ll u,v,c;
scanf("%lld%lld%lld",&u,&v,&c);
add(u,v,c);
}
while(bfs())
dfs(s,1e18);
printf("%lld",ans);
return 0;
}
#8 #9 TLE