int s,t;
int h[N],e[N],ne[N],idx,w[N];
int now[N];
void add(int a,int b,int c1,int c2)
{
e[idx] = b,ne[idx] = h[a],w[idx] = c1,h[a] = idx++;
e[idx] = a,ne[idx] = h[b],w[idx]= c2,h[b] = idx++;
}
int d[N];
bool bfs()
{
for (int i = 0;i <= n + m + 1;i++) d[i] = 0,now[i] = h[i];
queue<int> q;q.push(s);
d[s] = 1;
while (q.size())
{
int x= q.front();q.pop();
for (int i = h[x];i!=-1;i=ne[i])
{
if (w[i] && !d[e[i]])
{
d[e[i]] = d[x] + 1;
if (e[i] == t) return 1;q.push(e[i]);
}
}
}return 0;
}
int dinic(int x,int flow)
{
if (x == t) return flow;
int rest = flow;
for (int i = now[x];i!=-1&&rest;now[x]=i= ne[i])
{
if (w[i] && d[e[i]] == d[x] + 1)
{
int k = dinic(e[i],min(rest,w[i]));
rest -= k;w[i] -=k;w[i^1] += k;
if (!k) d[e[i]] = -1;
}
}
return flow - rest;
}
int maxflow()
{
int res = 0;while(bfs()) res += dinic(s,INF);
return res;
}