#include <iostream>
#include <vector>
#define N 20000
#define INF 2<<29
#define LL long long int
using namespace std;
int n,m;
struct Node
{
int to;
LL cap;
unsigned long rev;
};
LL Min(LL a,LL b)
{
return a>b?b:a;
}
vector<Node> g[N];
int used[N];
LL dfs(int now,LL f)
{
if(now==n)
return f;
used[now]=1;
for(int i=0;i<g[now].size();i++)
{
Node &e=g[now][i];
if(!used[e.to]&&e.cap>0)
{
//used[e.to]=1;
LL temp=dfs(e.to,Min(f,e.cap));
if(temp>0)
{
e.cap-=temp;
g[e.to][e.rev].cap+=temp;
return temp;
}
}
}
return 0;
}
void addEdge(int from,int to,LL cap)
{
g[from].push_back((Node){to,cap,g[to].size()});
g[to].push_back((Node){from,0,g[from].size()-1});
}
LL solve()
{
LL ans=0;
for(;;)
{
fill(used,used+n+1,0);
LL d=dfs(1,INF);
if(d==0)
return ans;
ans+=d;
}
}
void ini()
{
for(int i=0;i<=n;i++)
g[i].clear();
fill(used,used+n+1,0);
}
int main(int argc, const char * argv[]) {
cin.sync_with_stdio(false);
while(cin>>m>>n)
{
ini();
for(int i=0;i<m;i++)
{
LL x,y,c;
cin>>x>>y>>c;
addEdge(x,y,c);
}
cout<<solve()<<endl;
}
return 0;
}