#include <fstream>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include <iomanip>
#define ll long long
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int NMAX = 1000;
const int INF = 1e9;
int n, m, addflow, maxflow;
vector<int> G[NMAX + 1];
int capacity[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];
int GetFlow()
{
for(int i = 1; i <= n; i++)
parent[i] = 0;
parent[1] = -1;
queue<pair<int, int>> Q;
Q.push({1, INF});
while(!Q.empty())
{
int node = Q.front().first;
int minflow = Q.front().second;
Q.pop();
if(node == n)
return minflow;
for(int nextNode : G[node])
if(!parent[nextNode] && capacity[node][nextNode])
{
parent[nextNode] = node;
int minflownext = min(minflow, capacity[node][nextNode]);
Q.push({nextNode, minflownext});
}
}
return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int a, b, c;
cin >> a >> b >> c;
capacity[a][b] += c;
G[a].push_back(b);
G[b].push_back(a);
}
addflow = GetFlow();
while(addflow > 0)
{
maxflow += addflow;
int curent = n;
while(curent != 1)
{
int previ = parent[curent];
capacity[previ][curent] -= addflow;
capacity[curent][previ] += addflow;
curent = previ;
}
addflow = GetFlow();
}
cout << maxflow;
return 0;
}