#include<bits/stdc++.h>
using namespace std;
const int maxn = 205;
const int maxm = 5005;
const int flow_max = 0x7fffffff;
int capa[maxn][maxn], flow[maxn];
int n, m, s, t, pre[maxn], maxflow=0, increase=0;
queue<int> q;
int bfs(int src, int des) {
while(!q.empty()) q.pop();
for (int i=1; i <= n; i++) pre[i] = -1;
flow[src] = flow_max;
pre[src] = 0;
q.push(src);
while (!q.empty()) {
int v = q.front();
q.pop();
if (v == des) break;
for (int i=1; i <= n; i ++) {
if(capa[v][i] > 0 && i != src && pre[i] == -1) {
q.push(i);
pre[i] = v;
flow[i] = min(capa[v][i], flow[v]);
}
}
}
if (pre[des] == -1) return -1;
else return flow[des];
}
int maxFlow(int src, int des ) {
int increase = 0;
int sumflow = 0;
while ((increase = bfs(src, des)) != -1) {
int k = des;
while(k != src) {
int last = pre[k];
capa[last][k] -= increase;
capa[k][last] += increase;
k = last;
}
sumflow += increase;
}
return sumflow;
}
int main(void) {
cin >> n >> m >> s >> t;
memset(capa, 0, sizeof(capa));
memset(flow, 0, sizeof(flow));
int x, y;
int c;
for (int i=0; i < m; i ++) {
cin >> x >> y >> c;
capa[x][y] += c;
}
cout << maxFlow(s, t);
return 0;
}