#include
#include
#include
#include
using namespace std;
const int maxM = 100005, maxN = 10005;
int N, M, S, T, ans;
struct Edge {
int nxt, dis, to;
}e[maxM << 1]; int head[maxN], cnte = 1;
inline void add_Edge(int i, int j, int k) {
e[++cnte].dis = k, e[cnte].nxt = head[i], e[cnte].to = j, head[i] = cnte;
}
int dep[maxN];
queue <int> q;
bool bfs() {
memset(dep, 0, (N + 1) * sizeof(int));
q.push(S), dep[S] = 1;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int v, i = head[u]; i; i = e[i].nxt) {
if(e[i].dis && !dep[v = e[i].to]) {
dep[v] = dep[u] + 1, q.push(v);
}
}
}
return dep[T];
}
int dfs(int u, int in) {
if(u == T) return in;
int out = 0;
for(int v, i = head[u]; i && in; i = e[i].nxt) {
if(e[i].dis && dep[v = e[i].to] == dep[u] + 1) {
int tmp = dfs(v, min(e[i].dis, in));
e[i].dis -= tmp, e[i ^ 1].dis += tmp, in -= tmp, out += tmp;
}
}
if(!out) dep[u] = 0;
return out;
}
int main() {
scanf("%d%d%d%d", &N, &M, &S, &T);
for(int i = 1, u, v, w; i <= M; ++i) {
scanf("%d%d%d", &u, &v, &w);
add_Edge(u, v, w), add_Edge(v, u, 0);
}
while(bfs()) ans += dfs(S, 2e9);
printf("%d\n", ans);
return 0;
}