#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define MAX 1005
#define INF 1<<30
using namespace std;
int n, m, x, y, z, C[MAX][MAX], F[MAX][MAX], path[MAX], flux;
bool viz[MAX];
vector<int> l[MAX];
bool bfs(){
viz[1] = 1;
memset(viz + 2, 0, n - 1);
queue<int> q;
q.push(1);
while(!q.empty()){
int x = q.front();
q.pop();
if(x != n)
for(int i = 0; i < l[x].size(); i++)
if(C[x][l[x][i]] != F[x][l[x][i]] && !viz[l[x][i]]){
path[l[x][i]] = x;
viz[l[x][i]] = 1;
q.push(l[x][i]);
}
}
return viz[n];
}
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++){
scanf("%d%d%d", &x, &y, &z);
C[x][y] = z;
l[x].push_back(y);
l[y].push_back(x);
}
while(bfs())
for(int i = 0; i < l[n].size(); i++)
if(viz[l[n][i]] && C[l[n][i]][n] != F[l[n][i]][n]){
path[n] = l[n][i];
int u = n, minim = INF;
while(u != 1){
int v = path[u];
minim = min(minim, C[v][u] - F[v][u]);
u = v;
}
flux += minim;
u = n;
while(u != 1){
int v = path[u];
F[v][u] += minim;
F[u][v] -= minim;
u = v;
}
}
printf("%d\n", flux);
return 0;
}