RT
#include<iostream>
#include<queue>
using namespace std;
#define ll long long
const int MAXN=205;
const int MR=10005;
ll n,m,s,t;
ll cnt=1;
ll last[MAXN];
ll lv[MAXN],cur[MAXN];//层数 , 弧优化
struct edge{
ll v,w,la;
}a[MR];
void add(ll u,ll v,ll w){
++cnt;
a[cnt].v=v;
a[cnt].w=w;
a[cnt].la=last[u];
last[u]=cnt;
return;
}
bool bfs(){
for(int i=1;i<=n;i++)
lv[i]=-1;
queue<int> q;
q.push(s);
lv[s]=0;
while(!q.empty()){
int p=q.front();
q.pop();
for(int i=last[p];i;i=a[i].la){
ll to=a[i].v,flow=a[i].w;
if(lv[to]==-1&&flow){
lv[to]=lv[p]+1;
q.push(to);
}
}
}
return lv[t]!=-1;
}
ll dfs(ll p,ll flow){
if(p==t)
return flow;
ll rnm=flow;
for(int i=cur[p];i&&rnm;i=a[i].la){
cur[p]=i;
ll to=a[i].v,vol=a[i].w;
if(vol&&lv[to]==lv[p]+1){
ll c=dfs(to,min(flow,vol));
a[i].w-=c;
a[i^1].w+=c;
rnm-=c;
}
}
return flow-rnm;
}
int main(){
//freopen("in.txt","r",stdin);
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,0);
}
ll ans=0;
while(bfs()){
for(int i=1;i<=n;i++)
cur[i]=last[i];
ans+=dfs(s,1e18);
}
cout<<ans;
return 0;
}