#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define cin fin
#define cout fout
#define N 1005
int n, m, u, v, f, l[N], start[N];
struct muchie
{
int v, f, c, rev;
};
vector < vector < muchie > > g;
bool bfs(int s, int t)
{
for(int i = 1 ; i <= n ; i++)l[i] = -1;
l[s] = 0;
queue < int > q;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
for(auto i : g[u])
{
if(l[i.v] < 0 && i.f < i.c)
{
l[i.v] = l[u]+1;
q.push(i.v);
}
}
}
return l[t] < 0 ? false : true ;
}
int trimit(int u, int flow, int t, int start[])
{
if(u == t)
{
return flow;
}
for( ; start[u] < g[u].size() ; start[u]++)
{
if(l[g[u][start[u]].v] == l[u]+1 && g[u][start[u]].f < g[u][start[u]].c)
{
int acum = min(flow,g[u][start[u]].c-g[u][start[u]].f);
int temp = trimit(g[u][start[u]].v,acum,t,start);
if(temp > 0)
{
g[u][start[u]].f += temp;
g[g[u][start[u]].v][g[u][start[u]].rev].f -= temp;
return temp;
}
}
}
return 0;
}
int maxim(int s, int t)
{
if(s == t)return -1;
int tot = 0;
while(bfs(s,t))
{
memset(start,0,sizeof(start));
while(int flow = trimit(s,INT_MAX,t,start))
{
tot += flow;
}
}
return tot;
}
int main() {
cin >> n >> m;
g.resize(n+5);
for(int i = 1 ; i <= m ; i++)
{
cin >> u >> v >> f;
g[u].push_back({v,0,f,g[v].size()});
g[v].push_back({u,0,0,g[u].size()-1});
}
cout << maxim(1,n);
return 0;
}