#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define Nmax 1005
vector <int> graph[Nmax];
int c[Nmax][Nmax], f[Nmax][Nmax];
int father[Nmax];
int n, m, s, t, flow;
void read(){
freopen("maxflow.in", "r", stdin);
int u, v, cc;
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++i){
scanf("%d %d %d", &u, &v, &cc);
c[u][v] = cc;
graph[u].push_back(v);
graph[v].push_back(u);
}
s = 1;
t = n;
fclose(stdin);
}
inline int min(int a, int b){
if (a < b)
return a;
return b;
}
inline int bfs(){
queue <int> q;
vector <int>::iterator it;
int u;
for (int i = 1; i <= n; ++i)
father[i] = -1;
q.push(s);
while ( !q.empty() ){
u = q.front();
q.pop();
for (it = graph[u].begin(); it != graph[u].end(); ++it)
if (father[*it] == -1 && c[u][*it] != f[u][*it]){
father[*it] = u;
q.push(*it);
}
}
if (father[t] != -1)
return 1;
return 0;
}
void dinic(){
vector <int>::iterator it;
int f_min;
while ( bfs() ){
for (it = graph[t].begin(); it != graph[t].end(); ++it)
if (father[*it] != -1 && c[*it][t] != f[*it][t]){
f_min = c[*it][t] - f[*it][t];
for (int i = *it; i != s; i = father[i])
f_min = min(f_min, c[ father[i] ][i] - f[ father[i] ][i]);
f[*it][t] += f_min;
f[t][*it] -= f_min;
for (int i = *it; i != s; i = father[i]){
f[ father[i] ][i] += f_min;
f[i][ father[i] ] -= f_min;
}
flow += f_min;
}
}
}
void write(){
freopen("maxflow.out", "w", stdout);
printf("%d\n", flow);
fclose(stdout);
}
int main(){
read();
dinic();
write();
}