structGraph { structEdge { int v, nt; ll c; } e[M << 1]; int hd[N], tot = 1; voidadd(int u, int v, ll c){ e[++tot] = {v, hd[u], c}, hd[u] = tot; } voiduadd(int u, int v, ll c){ add(u, v, c), add(v, u, 0); } } g;
int n, m;
namespace GAP { int S, T;
bool vis[N];
int cur[N], dep[N], num[N];
int prep[N], pree[N];
voidbfs(){ queue<int> q;
q.push(T);
dep[T] = 0, vis[T] = 1, cur[T] = g.hd[T], num[0] = 1; while (!q.empty()) { int u = q.front(); q.pop(); for (int i = g.hd[u]; i; i = g.e[i].nt) { int v = g.e[i].v; if (!vis[v] && g.e[i ^ 1].c) { cur[v] = g.hd[v]; dep[v] = dep[u] + 1, vis[v] = 1, num[dep[v]]++; q.push(v); } } } }
ll flow(){ bfs(); ll ans = 0, sum = LLINF;
for (int i = 1; i <= n; i++) cur[i] = g.hd[i];
int u = S;
while (dep[S] < n) { if (u == T) { ans += sum;
for (int x = T; x != S; x = prep[x]) { int i = pree[x]; g.e[i].c -= sum, g.e[i ^ 1].c += sum; }
u = S, sum = LLINF; }
bool flag = 0; for (int i = cur[u]; i; i = g.e[i].nt) { int v = g.e[i].v; if (g.e[i].c && dep[u] == dep[v] + 1) { flag = 1; cur[u] = i; prep[v] = u, pree[v] = i; sum = min(sum, g.e[i].c); u = v; break; } }
if (!flag) { int cnt = n - 1; for (int i = g.hd[u]; i; i = g.e[i].nt) { int v = g.e[i].v; if (g.e[i].c) cnt = min(cnt, dep[v]); } --num[dep[u]], dep[u] = cnt + 1, num[dep[u]]++; if (num[dep[u]] == 0) break; cur[u] = g.hd[u]; if (u != S) u = prep[u]; } }
return ans; } } // namespace GAP
intmain(){ cin >> n >> m >> GAP::S >> GAP::T;
for (int i = 1, u, v; i <= m; i++) { ll c; cin >> u >> v >> c, g.uadd(u, v, c); }