/*
题意:给出排水沟的图,以及沟渠流量,求最大流出速率
题解:最大流,EK算法,完全模版;
*/
#include <iostream>
#include <cstring>
#include <queue>
#define EMAX 405
#define VMAX 205
using namespace std;
int EN;//边的总数
int head[VMAX];//用邻接表表示图
int pre[VMAX];//记录路径
int path[EMAX];//记录该点边的位置
struct edge
{
int to;
int weight;//流量
int next;
}e[EMAX];
void insert(int u, int v, int w)
{
e[EN].next = head[u];
e[EN].to = v;
e[EN].weight = w;
head[u] = EN++;
e[EN].next = head[v];
e[EN].to = u;
e[EN].weight = 0;//需要插入反向边
head[v] = EN++;
}
int flow_ek(int s, int t)
{
queue<int> Q;
int ret = 0;
while (true)
{
memset(pre,-1,sizeof(pre));
while (!Q.empty())
Q.pop();
Q.push(s);
while (!Q.empty())//BFS
{
int u = Q.front();
Q.pop();
for(int i=head[u]; i!=-1; i=e[i].next)
{
if (pre[e[i].to]==-1 && e[i].weight>0)
{
pre[e[i].to] = u;//记录路径
path[e[i].to] = i;//记录该点边的所在位置,方便后面直接查询
Q.push(e[i].to);
}
}
if (pre[t] != -1)//终点的pre不为-1,表示找到一条增广路径
break;
}
if (pre[t] == -1)//当BFS后找不到增广路径则结束循环
break;
int mw = -1;
for(int v=t; v!=s; v=pre[v])//找出当前路径中的流量的最小容量
{
if (mw == -1 || mw > e[path[v]].weight)
mw = e[path[v]].weight;
}
for(int v=t; v!=s; v=pre[v])//修改路径的容量,求出残余网络
{
e[path[v]].weight -= mw;
e[path[v]^1].weight += mw;//更新逆向边
}
ret += mw;
}
return ret;
}
int main(void)
{
int n,m,a,b,c;
while (cin >> n >> m)
{
memset(head,-1,sizeof(head));
EN = 0;
for(int i=0; i<n; i++)
{
cin >> a >> b >> c;
insert(a,b,c);
}
cout << flow_ek(1,m) << endl;
}
return 0;
}