#include <bits/stdc++.h>
using namespace std;
const long long inf=1e9, maxn=500005;
long long n, m, s, t, u, v;
long long w, ans, dis[maxn];
long long tot=1, now[maxn], head[maxn];
struct node {
long long to, net, val;
} e[maxn];
inline void add(long long u, long long v, long long w) {
e[++tot].to=v, e[tot].val=w, e[tot].net=head[u], head[u]=tot;
e[++tot].to=u, e[tot].val=0, e[tot].net=head[v], head[v]=tot;
}
inline long long bfs() {
for(long long i=1; i<=n; i++) dis[i]=inf;
queue<long long> q;
q.push(s);
dis[s]=0, now[s]=head[s];
while(!q.empty()) {
long long u=q.front();
q.pop();
for(long long i=head[u]; i; i=e[i].net) {
long long v=e[i].to;
if(e[i].val>0&&dis[v]==inf) {
q.push(v);
now[v]=head[v], dis[v]=dis[u]+1;
if(v==t) return 1;
}
}
}
return 0;
}
inline long long dfs(long long x, long long sum) {
if(x==t) return sum;
long long k, res=0;
for(long long i=now[x]; i&∑ i=e[i].net) {
now[x]=i;
long long v=e[i].to;
if(e[i].val>0&&(dis[v]==dis[x]+1)) {
k=dfs(v, min(sum, e[i].val));
if(k==0) dis[v]=inf;
e[i].val-=k, e[i^1].val+=k;
res+=k, sum-=k;
}
}
return res;
}
signed main() {
cin>>n>>m;
s=1, t=m;
for(long long i=1; i<=n; i++) {
scanf("%lld %lld %lld", &u, &v, &w);
add(u, v, w);
}
while(bfs()) ans+=dfs(s, inf);
return cout<<ans, 0;
}