rt
#include<bits/stdc++.h>
#define mp make_pair
#define For(i,a,b,c) for(int i=a;i<=b;i+=c)
#define Rof(i,a,b,c) for(int i=a;i>=b;i-=c)
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int N = 2e6 + 50;
inline int read() {
char c = getchar();
int x = 0, f = 1;
while (c<'0' or c>'9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' and c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * f;
}
vector<pair<int ,int > >v[N];
int n,m,s,t;
long long c[N<<1];
int flag[5210][5210];
bool vis[N];
pair<int,int> pre[N<<1];
long long dis[N];
long long ans;
bool bfs(){
queue<int>q;
for(int i=1;i<=n;i++) vis[i]=0;
q.push(s);
vis[s]=1;
dis[s]=1e18;
while(!q.empty()){
int p=q.front();
q.pop();
for(auto [to,i]:v[p]){
if(c[i]==0) continue;
if(vis[to]) continue;
vis[to]=1;
dis[to]=min(dis[p],c[i]);
pre[to]=mp(p,i);
q.push(to);
if(to==t) return 1;
}
}
return 0;
}
void update(){
#define X(x) x.first
#define Y(x) x.second
int x=t;
while(x!=s){
pii p=pre[x];
c[Y(p)]-=dis[t];
c[Y(p)^1]+=dis[t];
x=X(p);
}
ans+=dis[t];
return ;
}
signed main() {
n=read(),m=read();
s=read(),t=read();
for(int i=2;i<=m*2;i+=2){
int x=read(),y=read(),z=read();
if(!flag[x][y]){
c[i]=c[i^1]=z;
v[x].pb(mp(y,i));
v[y].pb(mp(x,i^1));
flag[x][y]=i;
}
else{
int f=flag[x][y];
c[f]+=z;
c[f^1]+=z;
}
}
while(bfs()!=0) update();
printf("%lld",ans);
return 0;
}