#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, x, y, i, S, D, TOTAL, T[1010], c[1010][1010], f[1010][1010];
vector<int > G[1010];
queue<int > q;
static inline int BFS()
{
for (int i = 1; i <= n; ++i)
T[i] = 0;
int ok = 0;
T[S] = -1;
q.push(S);
while (!q.empty())
{
int nod = q.front();
q.pop();
for (auto it : G[nod])
if (!T[it] && c[nod][it] > f[nod][it])
{
if (it != D)
{
T[it] = nod;
q.push(it);
}
else
ok = 1;
}
}
return ok;
}
static inline void dinic()
{
while (BFS())
for (auto it : G[D])
if (T[it] && c[it][D] > f[it][D])
{
T[D] = it;
int mini = (1LL << 31) - 1;
int nod = D;
while (nod != S)
{
if (c[T[nod]][nod] - f[T[nod]][nod] < mini)
mini = c[T[nod]][nod] - f[T[nod]][nod];
nod = T[nod];
}
if (mini <= 0)
continue;
TOTAL += mini;
nod = D;
while (nod != S)
{
f[T[nod]][nod] += mini;
f[nod][T[nod]] -= mini;
nod = T[nod];
}
}
}
int main()
{
ios::sync_with_stdio(false);
fin.tie(nullptr);
fin >> n >> m;
for (i = 1; i <= m; ++i)
{
fin >> x >> y;
fin >> c[x][y];
G[x].push_back(y);
G[y].push_back(x);
}
S = 1; D = n;
dinic();
fout << TOTAL;
return 0;
}