1 /*
2 网络流的最大流问题
3 刚学习Dinic算法。模版题
4 */
5 #include <cstring>
6 #include <cstdio>
7 #include <queue>
8 using namespace std;
9 const int maxn = 205;
10 const int inf = 0x3f3f3f3f;
11 struct
12 {
13 int c,f;
14 }edge[maxn][maxn];
15 int dis[maxn];
16 int v,e;
17 bool bfs()
18 {
19 memset(dis,0,sizeof dis);
20 queue<int> q;
21 q.push(1);
22 dis[1] = 1;
23 while(!q.empty())
24 {
25 int u = q.front(); q.pop();
26 for(int i = 1; i <= v; ++i)
27 if(!dis[i] && edge[u][i].c > edge[u][i].f)
28 {dis[i] = dis[u] + 1;q.push(i);}
29 }
30 return dis[v] != 0;
31 }
32 int dfs(int u,int c)
33 {
34 if(u == v) return c;
35 int temp = c;
36 for(int i = 1; i <= v && temp; ++i)
37 {
38 if(dis[i] != dis[u] + 1 || edge[u][i].c <= edge[u][i].f) continue;
39 int t = dfs(i,min(temp,edge[u][i].c - edge[u][i].f));
40 edge[u][i].f += t; edge[i][u].f -= t; temp -= t;
41 }
42 return c - temp;
43 }
44 int dinic()
45 {
46 int ans = 0;
47 while(bfs())
48 while(int t = dfs(1,inf))
49 ans += t;
50 return ans;
51 }
52 int main()
53 {
54 while(~scanf("%d%d",&e,&v))
55 {
56 memset(edge,0,sizeof edge);
57 while(e--)
58 {
59 int x,y,z;
60 scanf("%d%d%d",&x,&y,&z);
61 edge[x][y].c += z;
62 }
63 int ans = dinic();
64 printf("%d\n",ans);
65 }
66 return 0;
67 }