#include<bits/stdc++.h>
#define int long long
#define N 500001
using namespace std;
struct node{
int v,w,nxt;
}edge[N<<1];
int pre[N],n,m,s,t,head[N],cnt=1,dis[N];
bool vis[N],flag[5001][5001];
void add(int u,int v,int w){
edge[++cnt]={v,w,head[u]};
head[u]=cnt;
edge[++cnt]={u,0,head[v]};
head[v]=cnt;
}
bool bfs(int s,int t){
memset(vis,false,sizeof(vis));
queue<int> q;
vis[s]=true;
dis[s]=0x3f3f3f3f;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
if(edge[i].w==0) continue;
if(vis[v]==true) continue;
dis[v]=min(dis[u],edge[i].w);
pre[v]=i;
q.push(v);
vis[v]=true;
if(v==t) return true;
}
}
return false;
}
int EK(int s,int t){
int maxflow=0;
while(bfs(s,t)){
int v=t;
while(v!=s){
int i=pre[v];
edge[i].w-=dis[t];
edge[i^1].w+=dis[t];
v=edge[i^1].v;
}
maxflow+=dis[t];
}
return maxflow;
}
signed main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
if(flag[u][v]==0){
add(u,v,w);
flag[u][v]=cnt;
}else{
edge[flag[u][v]-1].w+=w;
}
}
cout<<EK(s,t);
}