#include <stdio.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define INF ((1LL<<62)-(1LL<<31))
#define min(p,q)((p)<(q)?(p):(q))

#define dinicVmax 110
ll vcnt;//頂点数
ll resflow[dinicVmax][dinicVmax];//残り流量
ll dist[dinicVmax];//ソースからの距離
ll checked[dinicVmax];//dfsの行き止まりフラグ
void dinicbfs(ll s){
	rep(i,0,vcnt)dist[i]=-1;
	dist[s]=0;
	//まだ流せる辺だけを使ってbfs
	ll que[dinicVmax*dinicVmax];
	ll qcnt=0,qptr=0;
	que[qcnt++]=s;
	while(qcnt!=qptr){
		ll a=que[qptr++];
		rep(b,0,vcnt)if(resflow[a][b]>0&&dist[b]==-1){
			dist[b]=dist[a]+1;
			que[qcnt++]=b;
		}
	}
}
ll dinicdfs(ll a,ll t,ll m){
	//aはm受け取ってる(⇔aから最大m流せる)
	//いくら流せるかを返す
	if(a==t)return m;
	if(checked[a])return 0;
	ll ans=0;
	checked[a]=1;
	rep(b,0,vcnt)if(dist[b]>dist[a]&&resflow[a][b]>0){
		ll addedflow=dinicdfs(b,t,min(m,resflow[a][b]));
		if(addedflow){
			resflow[a][b]-=addedflow;
			resflow[b][a]+=addedflow;
			checked[a]=0;
			ans+=addedflow;
			m-=addedflow;
			if(m<=0)break;
		}
	}
	return ans;
}
//ソース,シンク
ll dinic(ll s,ll t){
	ll ans=0;
	ll flag=1;
	while(flag){
		flag=0;//更新フラグ
		dinicbfs(s);
		while(!checked[s]){
			ll addedflow=dinicdfs(s,t,INF);
			ans+=addedflow;
			if(addedflow)flag=1;
		}
		rep(i,0,vcnt)checked[i]=0;
	}
	return ans;
}

int main(){
    ll ecnt;
    scanf("%lld%lld",&vcnt,&ecnt);
    rep(i,0,ecnt){
        ll a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        resflow[a][b]=c;
    }
    printf("%lld\n",dinic(0,vcnt-1));
}
