#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=214,inf=1ll<<62;
int val[maxn],visit[maxn],head[maxn],to[maxn],nxt[maxn];
int n,m,s,t;
int cnt=0;
queue < int > q;
void add1(int u,int v,int w){
nxt[cnt]=head[u];
to[cnt]=v;
val[cnt]=w;
head[u]=cnt++;
}
void add2(int u,int v,int w){
add1(u,v,w);
add1(v,u,0);
}
bool bfs(){
q=queue< int > ();
memset(visit,0,sizeof(visit));
q.emplace(s);
visit[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=nxt[i]){
if(!visit[to[i]]&&val[i]){
visit[to[i]]=visit[u]+1;
q.emplace(to[i]);
if(to[i]==t)return 1;
}
}
}return false;
}
int dfs(int u,int sum){
if(u==t)return sum;
int now=sum;
for(int i=head[u];~i;i=nxt[i]){
if(visit[to[i]]==visit[u]+1&&val[i]){
int fa=dfs(to[i],min(now,val[i]));
if(!fa)visit[to[i]]=0;
else{
now-=fa;
val[i]-=fa;
val[i^1]+=fa;
}
}
}
if(now==sum)visit[u]=0;
return sum-now;
}
int dinic(){
int sum=0;
while(bfs()){
sum+=dfs(s,inf);
}
return sum;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
add2(u,v,w);
}
cout<<dinic();
return 0;
}