#include<bits/stdc++.h>
# define ll long long
using namespace std;
const int N = 1e4,inf = 1023021618;
int n,t,m,s;
struct edge{
int u,v,nxt;
ll w;
}e[N];
int tot=-1;
int h[N],cur[N];
ll maxflorr;
int d[N];
inline void add(int u,int v,int w){
e[++tot].u = u;
e[tot].v = v;
e[tot].w = w;
e[tot].nxt = h[u];
h[u] = tot;
e[++tot].u = v;
e[tot].v = u;
e[tot].w = 0;
e[tot].nxt = h[v];
h[v] = tot;
}
inline bool bfs(){
for(int i = 1;i <= n;i ++)d[i] = -1;
queue<int>q;
q.push(s);
d[s] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = h[u];i>-1;i = e[i].nxt){
int v = e[i].v;
if(e[i].w > 0 && d[v] == -1){
q.push(v);
d[v] = d[u] + 1;
if(v == t)return 1;
}
}
}
return 0;
}
inline ll dfs(int u,ll flow){
if(u == t||flow==0)return flow;
ll f,res = 0;
for(int i = cur[u];i!=-1;i = e[i].nxt){
cur[u] = i;
int v = e[i].v;
if( d[v] == d[u] + 1 && (f = dfs(v,min(flow,e[i].w)))){
e[i].w -= f;
e[i^1].w += f;
res += f;
flow -= f;
if(flow==0)return res;
}
}
return res;
}
int main(){
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s >> t;
for(int i = 1;i <= m;i ++){
int u,v,w;
cin >> u >> v >> w;
add(u,v,w);
}
while(bfs()){
for(int i = 1;i <= n;i ++)cur[i] = h[i];
maxflorr += dfs(s,inf);
}
cout << maxflorr << endl;
return 0;
}