#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<(x)<<'\n'
#define dbg_v(x, n) cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n'
#define all(v) v.begin(), v.end()
#define INF 2000000010
#define NMAX 10010
int pred[NMAX];
int f[NMAX][NMAX], c[NMAX][NMAX];
bool vis[NMAX];
vector<int> adj[NMAX];
bool bfs(int source, int sink)
{
int v;
memset(vis, 0, sizeof vis);
queue<int> Q;
for(Q.push(source), vis[source] = true; !Q.empty(); Q.pop())
{
v = Q.front();
for(auto u : adj[v])
if(!vis[u] && f[v][u] < c[v][u])
{
vis[u] = true;
pred[u] = v;
if(u != sink)
Q.push(u);
}
}
return vis[sink];
}
int increaseFlow(int source, int node, int sink)
{
int minFlow = INF;
pred[sink] = node;
for(int v = sink; v != source && minFlow > 0; v = pred[v])
minFlow = min(minFlow, c[pred[v]][v] - f[pred[v]][v]);
if(minFlow)
{
for(int v = sink; v != source; v = pred[v])
f[pred[v]][v] += minFlow,
f[v][pred[v]] -= minFlow;
}
return minFlow;
}
int getFlow(int source, int sink)
{
int flow = 0;
while(bfs(source, sink))
{
for(auto u : adj[sink])
if(vis[u])
flow += increaseFlow(source, u, sink);
}
return flow;
}
void addEdge(int a, int b, int cap)
{
adj[a].push_back(b);
adj[b].push_back(a);
c[a][b] += cap;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
int q, i, n, m, p, k, a, source, sink;
source = 0;
sink = NMAX - 1;
//for(cin >> q; q; --q)
{
memset(f, 0, sizeof f);
memset(c, 0, sizeof c);
for(i = 0; i < NMAX; ++i) adj[i].clear();
cin >> n >> m;
source = 1;
sink = n;
for(int i = 1; i <= m; ++i)
{
int b, cap;
cin >> a >> b >> cap;
addEdge(a, b, cap);
}
/*for(i = 2; i <= n; ++i)
{
cin >> p;
addEdge(p, i, n);
}
for(i = 1; i <= m; ++i)
{
addEdge(source, n + i, 1);
for(cin >> k; k; --k)
{
cin >> a;
addEdge(n + i, a, 1);
}
}
for(i = 1; i <= n; ++i)
addEdge(i, sink, 1);
*/
cout << getFlow(source, sink) << '\n';
}
return 0;
}