#include <bits/stdc++.h>
#define MAXN 100100
#define MAXM 2023
#define INF 2147483647
using namespace std;
long long n,m,s,t,ans;
long long dis[MAXM];
struct edge{
int v,w;
};
vector <edge> G[MAXN];
inline void add_edge(int u,int v,int w)
{
G[u].push_back((edge){v,w});
G[v].push_back((edge){u,0});
}
inline bool BFS()
{
memset(dis,INF,sizeof(dis));
queue <int> q;
q.push(s);
dis[s]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<G[x].size();i++)
{
int to=G[x][i].v;
if(G[x][i].w>0 && dis[to]==INF)
{
q.push(to);
dis[to]=dis[x]+1;
if(to==t)
return true;
}
}
}
return false;
}
int DFS(int x,int sum)
{
if(x==t)
return sum;
long long k,res=0;
for(int i=0;i<G[x].size();i++)
{
int to=G[x][i].v;
if(G[x][i].w>0 && dis[to]==dis[x]+1)
{
k=DFS(to,min(sum,G[x][i].w));
if(k==0)
dis[to]=INF;
G[x][i].w-=k;
G[x][i].w+=k;
res+=k;
sum-=k;
}
}
return res;
}
void Dinic()
{
while(BFS()==true)
ans+=DFS(s,INF);
}
int main()
{
ios::sync_with_stdio(false);
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_edge(u,v,w);
}
Dinic();
cout << ans << endl;
return 0;
}