#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,m,s,t,x,y,z,id;
#define int long long
const int inf=0x3f3f3f3f3f3f3f3f;
int book[N],h[N],u[N],v[N],w[N];
int pre[N],nxt[N];
void add(int x,int y,int z){
u[id]=x,v[id]=y,w[id]=z;
nxt[id]=pre[x];
pre[x]=id++;
}
bool init(){
queue<int>q;
memset(h,0x3f,sizeof(h));
h[t]=0;
q.push(t);
while(!q.empty()){
int l=q.front();
q.pop();
for(int i=pre[l];i!=-1;i=nxt[i]){
if(w[i^1]&&h[v[i]]>h[l]+1){
h[v[i]]=h[l]+1;
q.push(v[i]);
}
}
}
return h[s]!=inf;
}
int e[N];
struct cmp{
bool operator ()(int x,int y){
return h[x]<h[y];
}
};
priority_queue<int,vector<int>,cmp>q;
void ppos(int x,int i,int tp){
w[i]-=tp;
w[i^1]+=tp;
e[x]-=tp;
e[v[i]]+=tp;
}
void push(int x){
for(int i=pre[x];i!=-1;i=nxt[i]){
if(w[i]&&h[v[i]]+1==h[x]){
int tp=min(e[x],w[i]);
ppos(x,i,tp);
if(v[i]!=s&&v[i]!=t&&!book[v[i]]){
q.push(v[i]);
book[v[i]]=1;
}
if(!e[x])break;
}
}
}
void rel(int x){
h[x]=inf;
for(int i=pre[x];i!=-1;i=nxt[i]){
if(w[i]&&h[v[i]]+1<h[x])
h[x]=h[v[i]]+1;
}
}
void high(int x){
for(int i=1;i<=n;i++){
if(i!=s&&i!=t&&i>x&&i<n+1)
h[i]=n+1;
}
}
int gap[N];
int hlpp(){
if(!init())return 0;
h[s]=n;
for(int i=1;i<=n;i++)
if(h[i]!=inf)gap[h[i]]++;
for(int i=pre[s];i!=-1;i=nxt[i]){
int tp=w[i];
if(tp){
ppos(s,i,tp);
if(v[i]!=s&&v[i]!=t&&!book[v[i]]){
q.push(v[i]);
book[v[i]]=1;
}
}
}
while(!q.empty()){
int l=q.top();
q.pop();
book[l]=0;
push(l);
if(e[l]){
gap[h[l]]--;
if(!gap[h[l]]){
high(h[l]);
}
rel(l);
gap[h[l]]++;
q.push(l);
book[l]=1;
}
}
return e[t];
}
signed main(){
cin>>n>>m>>s>>t;
memset(pre,-1,sizeof(pre));
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,0);
}
cout<<hlpp();
return 0;
}