int n,m,k,S,T;
int head[N],hcnt,lel[N],cur[N];
struct Node{int to,nxt,v;}node[maxn];
inline void add(int x,int y,int v){
node[hcnt].to=y;node[hcnt].nxt=head[x];node[hcnt].v=v;head[x]=hcnt++;
node[hcnt].to=x;node[hcnt].nxt=head[y];node[hcnt].v=0;head[y]=hcnt++;
}
int bfs(){
mst(lel,-1);lel[S]=0;
queue<int>q;q.push(S);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];~i;i=node[i].nxt){
int e=node[i].to;
if(lel[e]!=-1||!node[i].v)continue;
lel[e]=lel[x]+1;
if(e==T)return 1;
q.push(e);
}
}
return 0;
}
int dfs(int x,int f){
if(x==T)return f;
int fl,ret=0,e;
for(int i=cur[x];~i;i=node[i].nxt){
e=node[i].to;
if(lel[e]==lel[x]+1){
fl=f-ret;
fl=dfs(e,min(fl,node[i].v));
ret+=fl;
node[i].v-=fl;node[i^1].v+=fl;
if(f==ret)return f;
}
}
if(!ret)lel[x]=-1;
return ret;
}
int dinic(){
int ans=0;
while(bfs()){
mcp(cur,head);
ans+=dfs(S,inf);
}
return ans;
}