#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int NMAX = 1003;
vector<int> G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int viz[NMAX], N, src, dest;
void read_data()
{
ifstream fin("maxflow.in");
int M;
fin >> N >> M;
for (int i = 0; i < M; ++i) {
int x, y, c;
fin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = c;
}
}
int BFS()
{
memset(viz, 0, sizeof(viz));
viz[src] = src;
queue<int> Q;
Q.push(src);
while (!Q.empty()) {
int x = Q.front();
Q.pop();
if (x == dest)
continue;
for (vector<int>::iterator it = G[x].begin(); it!=G[x].end(); ++it)
if (!viz[*it] && C[x][*it] - F[x][*it] > 0) {
viz[*it] = x;
Q.push(*it);
}
}
return viz[dest];
}
int maxflow()
{
src = 1;
dest = N;
int flow = 0;
while(BFS()) {
for (vector<int>::iterator it = G[dest].begin(); it!=G[dest].end(); ++it) {
if (viz[*it] && C[*it][dest] - F[*it][dest] > 0) {
viz[dest] = *it;
int fmin = INF;
for (int x = dest; x != src; x = viz[x])
fmin = min(fmin, C[viz[x]][x] - F[viz[x]][x]);
if (fmin)
for (int x = dest; x != src; x = viz[x]) {
F[viz[x]][x] += fmin;
F[x][viz[x]] -= fmin;
}
flow += fmin;
}
}
}
return flow;
}
int main()
{
read_data();
ofstream fout("maxflow.out");
fout<<maxflow();
return 0;
}