#include<bits/stdc++.h>
#define MAXN 210
#define MAXM 5010
using namespace std;
typedef long long ll;
struct edge{
int pre, to; ll flow;
};
ll ans;
ll flow[MAXN];
int n, m, s, t, cnt = 1;
int head[MAXN], pre[MAXN];
edge e[MAXM << 1];
bool vis[MAXN];
void add_edge(int u, int v, ll f){
e[++cnt].pre = head[u];
e[cnt].to = v; e[cnt].flow = f;
head[u] = cnt;
}
bool bfs(){
memset(vis, 0, sizeof(vis));
queue<int> q; q.push(s);
vis[s] = true; flow[s] = 0x3f3f3f3f3f3f3f3f;
while(!q.empty()){
int now = q.front(); q.pop();
for(int i = head[now]; i; i = e[i].pre){
if(e[i].flow == 0) continue;
if(vis[e[i].to]) continue;
flow[e[i].to] = min(flow[now], e[i].flow);
pre[e[i].to] = i;
q.push(e[i].to);
vis[e[i].to] = true;
if(e[i].to == t) return true;
}
}
return false;
}
void update(){
int now = t;
while(now != s){
e[pre[now]].flow -= flow[t];
e[pre[now] ^ 1].flow += flow[t];
now = e[pre[now] ^ 1].to;
}
ans += flow[t];
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i = 1; i <= m; i++){
int u, v; ll f;
scanf("%d%d%lld",&u,&v,&f);
add_edge(u, v, f);
add_edge(v, u, -f);
}
while(bfs()) update();
printf("%lld\n",ans);
return 0;
}