void add(int u,int v,int w){
e[tot].v=v;
e[tot].w=w;
e[tot].nt=pre[u];
pre[u]=tot++;
e[tot].v=u;
e[tot].w=0;
e[tot].nt=pre[v];
pre[v]=tot++;
}
bool bfs(){
mt(dis,-1);
dis[s]=0;
queue<int> q;
while(sz(q)) q.pop();
q.push(s);
while(sz(q)){
int u=q.front();q.pop();
for(int i=pre[u];~i;i=e[i].nt){
int v=e[i].v,w=e[i].w;
if(dis[v]==-1&&w>0){
dis[v]=dis[u]+1;
if(v==t) return 1;
q.push(v);
}
}
}
return dis[t]!=-1;
}
int dfs(int u,int cp){
if(u==t) return cp;
int tmp=cp;
for(int i=pre[u];~i;i=e[i].nt){
int v=e[i].v,w=e[i].w;
if(dis[v]==dis[u]+1&&w>0){
int tt=dfs(v,min(tmp,w));
e[i].w-=tt;
e[i^1].w+=tt;
tmp-=tt;
if(tmp<=0) return cp;
}
}
return cp-tmp;
}
int dinic(){
int ret=0;
while(bfs()) ret+=dfs(s,inf);
return ret;
}