#include <iostream>
#include <algorithm>
#include <cstdio>
#include <deque>
#include <vector>
using namespace std;
const int DIM = 1005;
const int INF = 1000000005;
vector<int> edg[DIM];
int cap[DIM][DIM], ptr[DIM], dis[DIM];
bool bfs(int st, int en) {
for (int i = st; i <= en; ++i) {
ptr[i] = 0;
dis[i] = 0;
}
deque<int> que;
que.push_back(st); dis[st] = 1;
for (; que.size(); que.pop_front()) {
int x = que.front();
for (int y : edg[x]) {
if (!dis[y] && cap[x][y] > 0) {
dis[y] = dis[x] + 1;
if (y != en)
que.push_back(y);
}
}
}
return dis[en] > 0;
}
int dfs(int x, int en, int fl = INF) {
if (!fl)
return 0;
if (x == en)
return fl;
for (; ptr[x] < edg[x].size(); ++ptr[x]) {
int y = edg[x][ptr[x]];
if (dis[y] != dis[x] + 1 or cap[x][y] <= 0)
continue;
int nfl = dfs(y, en, min(fl, cap[x][y]));
if (nfl > 0) {
cap[x][y] -= nfl;
cap[y][x] += nfl;
return nfl;
}
}
return 0;
}
int main(void) {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int x, y, c;
cin >> x >> y >> c;
edg[x].push_back(y); cap[x][y] = c;
edg[y].push_back(x); cap[y][x] = 0;
}
int fl = 0;
while (bfs(1, n)) {
int nfl;
while (nfl = dfs(1, n)) {
fl += nfl;
}
}
cout << fl << "\n";
return 0;
}