#include <cstdio>
const int MAX_N = 1000;
const int MAX_M = 5000;
int mc[1+2*MAX_M], last[1+MAX_N], next[1+2*MAX_M], cap[1+2*MAX_M], flux[1+2*MAX_M];
int inv[1+2*MAX_M];
bool viz[1+MAX_N];
inline void addMuchie(int id, int a, int b, int c) {
mc[id] = b;
next[id] = last[a];
last[a] = id;
cap[id] = c;
}
int min(int a, int b) {
if(a < b)
return a;
return b;
}
int total;
bool augment(int node, int dest, int &flow) {
bool ok, r;
int primit = flow, sent, raised;
raised = 0;
//printf("%d ", node);
if(node == dest) {
total += flow;
//printf("%d ", primit);
return true;
} else {
ok = false;
int i = last[node];
while(i != 0) {
if(flux[i] < cap[i] && !viz[mc[i]]) {
viz[mc[i]] = true;
sent = min(primit - raised, cap[i] - flux[i]);
r = augment(mc[i], dest, sent);
if(r == true) {
ok = true;
raised = raised + sent;
flux[i] += sent;
flux[inv[i]] -= sent;
}
viz[mc[i]] = false;
}
i = next[i];
}
flow = raised;
}
return ok;
}
const int INF = 2000000000;
int main() {
int n, m, a, b, c, x;
FILE *fin = fopen("maxflow.in", "r");
fscanf(fin, "%d%d", &n, &m);
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d%d%d", &a, &b, &c);
addMuchie(i * 2 + 1, a, b, c);
inv[i * 2 + 1] = i * 2 + 2;
addMuchie(i * 2 + 2, b, a, 0);
}
fclose(fin);
while(augment(1, n, x = INF));
FILE *fout = fopen("maxflow.out", "w");
fprintf(fout, "%d", total);
fclose(fout);
return 0;
}