#include <bits/stdc++.h>
using namespace std;
int const nmax = 1005;
int f[nmax][nmax];
int cap[nmax][nmax];
bool BFmaxFlow(int s, int t, int* dad, vector<int>* adj, int V){
bool vis[nmax];
for(int i = 1; i <= nmax; ++i)
vis[i] = false;
queue<int> q;
q.push(s);
vis[s] = true;
while(!q.empty()){
int crt = q.front();
q.pop();
for(auto i : adj[crt]){
if(cap[crt][i] > f[crt][i] && vis[i] == false){
vis[i] = true;
q.push(i);
dad[i] = crt;
if(i == t)
return true;
}
}
}
return false;
}
int main(){
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int V, E;
fin >> V >> E;
vector<int> adj[nmax];
for(int i = 1; i <= E; ++i)
{
int src, dst, capacity;
fin >> src >> dst >> capacity;
adj[src].push_back(dst);
adj[dst].push_back(src);
cap[src][dst] = capacity;
}
int flow = 0;
int dad[nmax] = {0};
while(BFmaxFlow(1, V, dad, adj, V)) {
int mini = INT_MAX;
int crt = V;
while(crt != 1){
mini = min(mini, cap[dad[crt]][crt] - f[dad[crt]][crt]);
crt = dad[crt];
}
crt = V;
while(crt != 1){
f[dad[crt]][crt] += mini;
f[crt][dad[crt]] -= mini;
crt = dad[crt];
}
flow += mini;
}
fout << flow;
return 0;
}