#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int NMAX = 1005;
const int INF = 0x3f3f3f3f;
deque<int> que; int dst[NMAX];
int lst[NMAX][NMAX], aux[NMAX][NMAX], cap[NMAX][NMAX];
void bfs(int s, int d)
{
memset(dst, INF, (d + 1) << 2);
que.assign(1, s); dst[s] = 0;
for (; que.size(); que.pop_front()) {
int x = que.front(); aux[x][0] = 0;
if (x == d)
continue;
for (int i = 1; i <= lst[x][0]; ++i) {
int y = lst[x][i];
if (!cap[x][y])
continue;
if (dst[y] == INF)
que.push_back(y);
if (dst[y] >= dst[x] + 1) {
dst[y] = dst[x] + 1;
aux[x][++aux[x][0]] = y;
}
}
}
}
int dfs(int x, int d, int mxf)
{
if (mxf == 0) return 0;
if (x == d) return mxf;
int flo = 0;
for (int i = 1; i <= aux[x][0]; ++i) {
int y = aux[x][i];
int val = dfs(y, d, min(cap[x][y], mxf - flo));
if (val) {
cap[x][y] -= val;
cap[y][x] += val;
flo += val;
}
}
return flo;
}
int main(void)
{
int n, m;
in >> n >> m;
for (int i = 1; i <= m; ++i) {
int x, y, f;
in >> x >> y >> f;
lst[x][++lst[x][0]] = y;
lst[y][++lst[y][0]] = x;
cap[x][y] = f;
}
int x, ans = 0;
do {
bfs(1, n);
x = dfs(1, n, INF); ans += x;
} while (x);
out << ans << endl;
return 0;
}