#include <stdio.h>
#define MAXN 1000
#define MAXM 5000
#define INF 2000000000
int ult[MAXN], nod[2 * MAXM], next[2 * MAXM], cap[2 * MAXM], fol[2 * MAXM], suma[MAXN];
char tr[MAXN];
int n;
inline int min2(int a, int b){
return a < b ? a : b;
}
int dfs(int x, int max){
if(max <= 0)
return 0;
if(x == n - 1){
suma[x] += max;
return max;
}
tr[x] = 1;
int poz = ult[x], k = 0, sk = 0;
while(poz != -1){
if(!tr[nod[poz]]){
k = dfs(nod[poz], min2(max, cap[poz] - fol[poz]));
fol[poz] += k;
sk += k;
max -= k;
}
poz = next[poz];
}
suma[x] += sk;
return sk;
}
int main(){
FILE *in = fopen("maxflow.in", "r");
int m, i, x, y, z, dr = 0;
fscanf(in, "%d%d", &n, &m);
for(i = 0; i < n; i++)
ult[i] = -1;
for(i = 0; i < m; i++){
fscanf(in, "%d%d%d", &x, &y, &z);
x--; y--;
nod[dr] = x;
next[dr] = ult[y];
ult[y] = dr;
cap[dr] = 0;
dr++;
nod[dr] = y;
next[dr] = ult[x];
ult[x] = dr;
cap[dr] = z;
dr++;
}
fclose(in);
int last = -1;
while(last != suma[n - 1]){
last = suma[n - 1];
memset(tr, 0, sizeof tr);
dfs(0, INF);
}
FILE *out = fopen("maxflow.out", "w");
fprintf(out, "%d", suma[n - 1]);
fclose(out);
return 0;
}