#include <bits/stdc++.h>
#define int long long
#define inf 0x7f7f7f7f
using namespace std;
class Edge
{
public:
int u,v,w,next;
}e[100001];
queue<int> r;
int elast[201],cur[201],level[201],cnt[201],n,s,t,link(1),ans;
void add(int u,int v,int w)
{
e[++link]=(Edge){u,v,w,elast[u]};
elast[u]=link;
}
void bfs(int u)
{
memset(level,inf,sizeof(level));
cnt[level[u]=0]=1;
r.push(u);
int v,i;
while(!r.empty())
{
u=r.front(),r.pop();
for(i=elast[u];i!=0;i=e[i].next)
{
v=e[i].v;
if (level[v]>=inf)
{
cnt[level[v]=level[u]+1]++;
r.push(v);
}
}
}
}
int augment(int u,int flow)
{
int v,k(0),temp,i;
if (u==t) return flow;
for(i=cur[u];i!=0;i=e[i].next)
{
cur[u]=i;
v=e[i].v;
if (e[i].w>0 && level[u]==level[v]+1)
{
temp=augment(v,min(flow-k,e[i].w));
e[i].w-=temp,e[i^1].w+=temp;
k+=temp;
if (k==flow || level[s]>t)
return k;
}
}
if (level[s]>t) return k;
cnt[level[u]]--;
if (!cnt[level[u]]) level[s]=t+1;
cnt[++level[u]]++;
cur[u]=elast[u];
return k;
}
signed main()
{
int m,u,v,w;
scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
while(m--)
{
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
add(v,u,0);
}
bfs(t);
while(level[s]<=t)
{
memcpy(cur,elast,sizeof(cur));
ans+=augment(s,inf);
}
printf("%lld",ans);
}