#include<bits/stdc++.h>
#define maxn 1920480
using namespace std;
struct Edge{int to,w,next;}e[maxn];
int head[maxn],cur[maxn],gap[maxn],h[maxn],level[maxn];
int n,m,s,t;
int cnt=0;
void add(int u,int v,int w){e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt++;}
int bfs()
{
queue<int> q;
memset(level,-1,sizeof(level));//important
q.push(s);level[s]=0;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];~i;i=e[i].next)
{
int j=e[i].to;
if(level[j]==-1&&e[i].w)
{
level[j]=level[x]+1;
q.push(j);
}
}
}
return !(level[t]==-1);
}
int dinic(int now,int flow)
{
if(now==t) return flow;
int res=0;
for(int i=cur[now];~i;i=e[i].next)//!
{
int j=e[i].to;
if(level[now]+1==level[j]&&e[i].w)
{
int f=dinic(j,min(flow-res,e[i].w));
e[i].w-=f,e[i^1].w+=f,res+=f;
if(res==flow) return flow;
if(e[i].w) cur[now]=i;//!
}
}
if(!res) level[now]=-1;
return res;
}
int main(){
cin>>n>>m>>s>>t;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
add(t1,t2,t3),add(t2,t1,0);
}
int ans=0;
while(bfs())
{
for(int i=1;i<=n;i++) cur[i]=head[i];
while(int tmp=dinic(s,1e9))
ans+=tmp;
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
#define maxn 1920480
using namespace std;
struct Edge{int to,w,next;}e[maxn];
int head[maxn],cur[maxn],gap[maxn],h[maxn];
int n,m,s,t;
int cnt=0;
void add(int u,int v,int w){e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt++;}
int isap(int x,int flow)
{
if(x==t) return flow;
int res=0;
for(int i=cur[x];~i;i=e[i].next)
{
int j=e[i].to;
if(h[x]==h[j]+1&&e[i].w)
{
int f=isap(j,min(e[i].w,flow-res));
e[i].w-=f,e[i^1].w+=f,res+=f;
if(res==flow) return flow;
if(e[i].w) cur[x]=i;
}
}
--gap[h[x]];
if(gap[h[x]]==0) h[s]=n+2;
gap[++h[x]]++;
cur[x]=head[x];
return res;
}
int main(){
cin>>n>>m>>s>>t;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
add(t1,t2,t3),add(t2,t1,0);
}
int ans=0;
for(int i=1;i<=n;i++) cur[i]=head[i];
while(h[s]<n+2)
ans+=isap(s,1e9);
cout<<ans<<endl;
return 0;
}