#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,i,j,a,b,c;
struct Dinic{
struct edge{
int x;
int cap;
int ind;
};
vector<vector<edge>>V;
int dist[1004],viz[1004],last[1004],s,t;
Dinic(){
V.resize(n+1);
}
void add_edge(int a,int b, int c){
V[a].push_back({b,c,V[b].size()});
V[b].push_back({a,0,V[a].size()-1});
}
int bfs(){
for (int i=1;i<=n;i++){
dist[i]=2004;
last[i]=0;
}
queue<int>Q;
dist[s]=0;
Q.push(s);
while(!Q.empty()){
int now=Q.front();
Q.pop();
for (auto &[to,c,_]:V[now]){
if (c&&dist[to]==2004){
dist[to]=dist[now]+1;
Q.push(to);
}
}
}
return (dist[t]!=2004);
}
int dfs(int node,int flow=1e9){
if (flow==0){
return 0;
}
if (node==t){
return flow;
}
for (;last[node]<V[node].size();last[node]++){
int i=last[node];
auto &it=V[node][i];
if ((dist[it.x]==dist[node]+1)&&it.cap){
int f=dfs(it.x,min(flow,it.cap));
if (f){
it.cap-=f;
V[it.x][it.ind].cap+=f;
return f;
}
}
}
return 0;
}
void solve (){
int sol=0;
s=1;t=n;
while(bfs()){
while(int f=dfs(s))sol+=f;
}
g<<sol<<'\n';
}
};
int main()
{ f>>n>>m;
Dinic dinic;
for (i=1;i<=m;i++){
f>>a>>b>>c;
dinic.add_edge(a,b,c);
}
dinic.solve();
return 0;
}