//在本题中,n是边,m是点
#include<iostream>
#include<queue>
#include<cstring>//memset
#include<algorithm>//min
using namespace std;
const int N = 210,M = 210;
const int inf = 0x3f3f3f3f;
int h[N],e[M*2],ne[M*2],w[M*2],idx;
int n,m;
//dist: 节点到源点的最短路径的最小流量(瓶颈流量)
//pre: 存储路径的前驱,st: 标记节点是否已访问
int dist[N],pre[N],st[N];
void add(int a,int b,int c){
e[idx] = b,w[idx] = c,ne[idx] = h[a];h[a] = idx++;
//w为边的容量
}
bool bfs(){
memset(st, 0, sizeof st);
memset(pre, -1, sizeof pre);
memset(dist, 0, sizeof dist);
queue<int> q;
st[1] = 1;//源点已访问
dist[1] = inf;//源点流量设置为无穷大
q.push(1);//源点加入队列
//当队列不为空
while(q.size()){
int t = q.front();//获取队头
q.pop();
for(int i = h[t]; i != -1; i = ne[i])//遍历队头的所有邻接边
{
int j = e[i];//邻接边的终点
//如果j未访问过,并且边还有剩余流量
if(!st[j] && w[i] > 0)
{
st[j] = 1;
dist[j] = min(dist[t], w[i]);
pre[j] = i;//记录j的前驱边ji
if(j == m) return true;
q.push(j);
}
}
}
return false;
}
void EK(){
int res = 0;//初始化最大流
while(bfs()){//每次找到增广路径就执行一次
res += dist[m];
//id^1表示反向边
for(int i = m; i != 1; i = e[pre[i] ^ 1]){
int id = pre[i];//获取当前编号
w[id] -= dist[m];
w[id ^ 1] += dist[m];
}
}
cout << res <<endl;
}
main(){
cin >> n >> m;
memset(h, -1,sizeof h);//初始化邻接表
while(n--){
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
add(b, a, 0);
}
EK();
}