edge e[maxm];
int h[maxn],ecnt,hh[maxn];
int lv[maxn];
bool bfs(int s,int t)
{
queue<int> q;
clr(lv,-1);
lv[s]=0;q.push(s);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=h[u];~i;i=e[i].next)
{
int v=e[i].v;
if(~lv[v] || !e[i].w)continue;
lv[v]=lv[u]+1;
q.push(v);
}
}
memcpy(hh,h,sizeof(h[0])*tot);
return lv[t]!=-1;
}
int dfs(int u,int flow,int t)
{
if(u==t)return flow;
int ret=0,f;
for(int i=hh[u];~i;i=e[i].next)
{
hh[u]=i;
int v=e[i].v;
if(!e[i].w || lv[u]+1!=lv[v])continue;
f=dfs(v,min(flow-ret,e[i].w),t);
ret+=f;
e[i].w-=f;
e[i^1].w+=f;
if(ret==flow)return ret;
}
return ret;
}
inline int dinic(int s,int t)
{
int ret=0;
while(bfs(s,t))ret+=dfs(s,inf,t);
return ret;
}