#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define NMAX 1004
#define INF 0x3f3f3f3f
using namespace std;
FILE* fin = fopen("maxflow.in","r");
FILE* fout = fopen("maxflow.out","w");
int cap[NMAX][NMAX],fl[NMAX][NMAX],C[NMAX],viz[NMAX];
int TT[NMAX];
vector<int> G[NMAX];
int N,M;
int flux = 0;
int BFS();
void FluxMaxim();
void Citire();
void Afisare();
int main()
{
Citire();
FluxMaxim();
Afisare();
}
void Citire()
{
int i;
int x,y,z;
fscanf(fin, "%d %d",&N,&M);
for (i = 1; i <= M; i++)
{
fscanf(fin,"%d %d %d", &x, &y, &z);
cap[x][y] += z;
G[x].push_back(y);
G[y].push_back(x);
}
}
void FluxMaxim()
{
int i,j,fmin;
while(BFS()) //2.1 cauta lant de ameliorare
for( i = 0; i < G[N].size(); i++) //2.2 amelioram fluxul
{
j = G[N][i];
if(fl[j][N] == cap[j][N] || !viz[j]) continue;
TT[N] = j;
fmin = INF;
for (j = N; j != 1; j = TT[j])
fmin = min(fmin, cap[ TT[j] ][j] - fl[ TT[j] ][j]);
//nu avem ce ameliora
if (fmin == 0) continue;
//amelioram
for (j = N; j != 1; j = TT[j])
{
fl[ TT[j] ][j] += fmin;
fl[j][ TT[j] ] -= fmin;
}
flux += fmin;
}
}
int BFS() //MARCAJ FF
{
int nod, i, j, vf;
C[0] = 1;
C[1] = 1;
viz[1] = 1;
memset(viz, 0, sizeof(viz));
for( i = 1; i<= C[0]; i++)
{
nod = C[i];
if (nod == N) continue;
for (j = 0; j < G[nod].size(); j++)
{
vf = G[nod][j];
//conditii: f(x,y) < c(x,y) cu x marcat si y nemarcat
if (fl[nod][vf] == cap[nod][vf] || viz[vf]) continue;
//marcam y cu +nod
viz[vf] = 1;
C[ ++C[0] ] = vf;
TT[vf] = nod;
}
}
return viz[N]; //daca e marcat f => am gasit lant de ameliorare
}
void Afisare()
{
fprintf(fout,"%d\n",flux);
}