#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=205,M=1e4+5;
const ll INF=0x3f3f3f3f;
int tot=1,head[N],cur[N],to[M],nxt[M],level[N];
ll val[M];//剩余容量
bool vis[N];
void add(int u,int v,ll c){
nxt[++tot]=head[u];
head[u]=tot;
to[tot]=v;
val[tot]=c;
}
void addedge(int u,int v,ll c){
add(u,v,c);
add(v,u,0);
}
bool BFS(int s,int t){
memset(vis,0,sizeof(vis));
queue<int>que;
que.push(s);
level[s]=0;
vis[s]=1;
cur[s]=head[s];
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(!vis[v]&&val[i]>0){
vis[v]=1;
level[v]=level[u]+1;
cur[v]=head[v];
que.push(v);
if(v==t) return true;
}
}
}
return vis[t];
}
ll DFS(int u,ll ret,int s,int t){
if(u==t||ret==0) return ret;//ret 表示 S 到这里最多能流入的流量
ll Flow=0,f;//Flow 表示经过该点的所有流量和(相当于流出的总量);f 表示当前最小的剩余容量
for(int i=cur[u];i&&ret;i=nxt[i]){
cur[u]=i;//当前弧优化
int v=to[i];
if(level[u]+1==level[v]&&val[i]>0){
f=DFS(v,min(ret,val[i]),s,t);
if(f==0) vis[v]=0;
val[i]-=f;
val[i^1]+=f;
Flow+=f;
ret-=f;
}
}
return Flow;//返回实际使用的流量
}
ll Dinic(int s,int t){
ll Flow=0;
while(BFS(s,t)){
Flow+=DFS(s,INF,s,t);
}
return Flow;
}
int main(){
int n,m,s,t;
scanf("%d %d %d %d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
int u,v;
ll c;
scanf("%d %d %lld",&u,&v,&c);
addedge(u,v,c);
}
printf("%lld",Dinic(s,t));
return 0;
}