#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vl = vector<ll>;
#define FOR(i, a, b) for(ll i = (a); i < (b); i++)
#define FORD(i, a, b) for(ll i = (b)-1; i >= (a); i--)
 
typedef vector<int> VI;
typedef vector<VI> VVI;
const ll INF = 1000000000000000000LL;
 
#define VEI(w,e) ((E[e].u == w) ? E[e].v : E[e].u)
#define CAP(w,e) ((E[e].u == w) ? E[e].cap[0] - E[e].flow : E[e].cap[1] + E[e].flow)
#define ADD(w,e,f) E[e].flow += ((E[e].u == w) ? (f) : (-(f)))
 
struct Edge { int u, v; ll cap[2], flow; };
 
VI d, act;
 
bool bfs(int s, int t, VVI& adj, vector<Edge>& E, ll lim) {
  queue<int> Q;
  d = VI(adj.size(), -1);
  d[t] = 0;
  Q.push(t);
  while (not Q.empty() and d[s] == -1) {
    int u = Q.front(); Q.pop();
    for (int i = 0; i < int(adj[u].size()); ++i) {
      int e = adj[u][i], v = VEI(u, e);
      if (CAP(v, e) >= lim and d[v] == -1) {
        d[v] = d[u] + 1;
        Q.push(v);
      }
    }
  }
  return d[s] >= 0;
}
 
bool dfs(int u,int t,ll bot,VVI& adj,vector<Edge>& E, ll lim) {
  if (bot == 0) return false;
  if (u == t) return true;
  for (; act[u] < int(adj[u].size()); ++act[u]) {
    int e = adj[u][act[u]];
    if (CAP(u, e) >= lim and d[u] == d[VEI(u, e)] + 1) {
      ll inc=dfs(VEI(u,e),t,min(bot,CAP(u,e)),adj,E,lim);
      if (inc) {
        ADD(u, e, lim);
        return true;
      }
    }
  }
  return false;
}
 
ll maxflow(int s, int t, VVI& adj, vector<Edge>& E) {
  for (int i=0; i<int(E.size()); ++i) E[i].flow = 0;
  ll flow = 0;
  for(int lim = (1<<30); lim >= 1;) {
    if(!bfs(s,t,adj,E, lim)) {
      lim >>= 1;
      continue;
    }
    act = VI(adj.size(), 0);
    while (dfs(s,t,INF, adj, E, lim)) flow += lim;
  }
  return flow;
}
 
void addEdge(int u, int v, VVI& adj, vector<Edge>& E, ll cap){
	Edge e;
	e.u = u;
	e.v = v;
	e.cap[0] = cap;
	e.cap[1] = cap;
	e.flow = 0;
	adj[u].push_back(E.size());
	adj[v].push_back(E.size());
	E.push_back(e);
}
int main() {
	int n, m;
	cin >> n >> m;
	vector<vector<int>>adj(n);
	vector<Edge> E;
	for(int i = 0; i < m; ++i) {
		int x,y,w;
		cin >> x >> y >> w;
		--x;--y;
		addEdge(x, y, adj, E, w);
	}
	cout << maxflow(0, n-1, adj ,E) << endl;
}