#include<bits/stdc++.h>
using
namespace
std;
#define M 10001
#define inf 1000000
int
ip=1,head[M],lv[M];
int
s,T;
struct
E{
int
to,next,cap;
}e[M*10];
void
add(
int
x,
int
y,
int
z){
e[++ip].to=y;e[ip].next=head[x];e[ip].cap=z;head[x]=ip;
e[++ip].to=x;e[ip].next=head[y];e[ip].cap=0;head[y]=ip;
}
bool
bfs(){
memset
(lv,-1,
sizeof
(lv));
queue<
int
> q;
q.push(s);
lv[s]=0;
while
(!q.empty()){
int
t=q.front();
q.pop();
for
(
int
i=head[t];i;i=e[i].next){
if
(lv[e[i].to]==-1&&e[i].cap){
lv[e[i].to]=lv[t]+1;
q.push(e[i].to);
}
}
}
return
lv[T]!=-1;
}
int
dfs(
int
u,
int
f){
if
(u==T||f==0)
return
f;
int
ret=0;
for
(
int
i=head[u];i;i=e[i].next){
if
(lv[e[i].to]==lv[u]+1&&e[i].cap){
int
w=dfs(e[i].to,min(f,e[i].cap));
e[i].cap-=w;
e[i^1].cap+=w;
f-=w;
ret+=w;
}
}
if
(!ret)lv[u]=-1;
return
ret;
}
int
dinic(){
int
ans=0;
while
(bfs()){
ans+=dfs(s,inf);
}
return
ans;
}