#include<bits/stdc++.h>
using namespace std;
const int MAXN = 300;
const long long INF = 1e18;
bool vis[MAXN][MAXN];
long long flow[MAXN],c[MAXN][MAXN];
vector<int> ve[MAXN];
int d[MAXN];
int n,m,s,t;
bool bfs(){
memset(d,0,sizeof(d));
queue<int> q;
q.push(s);
d[s] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=0;i<ve[u].size();i++){
int v = ve[u][i];
if(d[v]||c[u][v]<=0) continue;
d[v] = d[u]+1;
q.push(v);
}
}
if(d[t]==0) return false;
return true;
}
long long dfs(int u,long long flow){
if(u==t) return flow;
long long out=0;
for(int i=0;i<ve[u].size();i++){
int v = ve[u][i];
if(d[v]!=d[u]+1||c[u][v]<=0) continue;
long long delta = dfs(v,min(flow,c[u][v]));
if(delta<=0) continue;
c[u][v]-=delta;
if(!vis[v][u]){
vis[v][u] = true;
ve[v].push_back(u);
}
c[v][u]+=delta;
return delta;
}
return 0;
}
long long get_maxFlow()
{
long long maxFlow = 0, tmp;
while(bfs())
while(tmp = dfs(s, INF))
maxFlow += tmp;
return maxFlow;
}
int main(){
memset(c,0,sizeof(c));
memset(vis,0,sizeof(vis));
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=0;i<m;i++){
int u,v;
long long w;
scanf("%d%d%lld",&u,&v,&w);
c[u][v]+=w;
if(!vis[u][v]){
ve[u].push_back(v);
vis[u][v] = true;
}
}
printf("%lld",get_maxFlow());
return 0;
}