#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;
//		cout<<2<<" ";
	}
	ans+=dis[t];
}
int bfs()
{
//	memset(dis,0,sizeof dis);
	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);
	}
//	cout<<bfs();
	while(bfs())
	{
		update();
//		cout<<1<<"\n";
	}
	cout<<ans;
	return (_^_^_);
}