#include<bits/stdc++.h>
#define int long long
#define void inline void
const int N = 5e3+5;
using namespace std;
int _;
struct Edge
{
int to,nxt,w;
} g[N<<1];
int r[N],tot=1,vis[N],pre[N],dis[N],ans;
int n,m,s,t,u,v,w;
void add(int u,int v,int w)
{
g[++tot]= {v,r[u],w};
r[u] = tot;
g[++tot]= {u,r[v],0};
r[v] = tot;
}
void update()
{
int x = t;
while(x != s)
{
int e=pre[x];
g[e].w -= dis[t];
g[e^1].w += dis[t];
x=g[e^1].to;
}
ans+=dis[t];
}
int bfs()
{
for(int i=1; i<=n; ++i)
vis[i] = 0;
queue<int> q;
q.push(s);
dis[s] = 1145141919810;
while(! q.empty())
{
int x=q.front();
q.pop();
for(int e = r[x] ; e; e = g[e].nxt)
{
if(g[e].w<=0)
continue;
int v = g[e].to;
if( vis[v])
continue;
vis[v] = 1;
dis[v] = min( dis[x], g[e].w);
pre[v] = e;
q.push(v);
if( v == t) return 1;
}
}
return (_^_^_);
}
signed main()
{
cin>>n>>m>>s>>t;
for(int i=1; i<=m; i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
while(bfs())
{
update();
}
cout<<ans;
return (_^_^_);
}