//Tarjan求强连通分量
void tarjan(int now){
dfn[now]=low[now]=++dfnc;
sta[++top]=now;
for(int i=head[now];i!=-1;i=b[i].next){
int u=b[i].to;
if(!dfn[u]){
tarjan(u);
low[now]=min(low[now],low[u]);
}
else if(!shuyu[u]) low[now]=min(low[now],dfn[u]);
}
if(dfn[now]==low[now]){
++scc;
while(1){
int x=sta[top--];
shuyu[x]=scc;
siz[scc]++;
if(x==now) break;
}
}
}
//强连通分量缩点
for(int i=1;i<=n;i++){
for(int j=head[i];j!=-1;j=b[j].next){
int u=b[i].to;
int ii=shuyu[i],jj=shuyu[u];
if(ii!=jj){
ad(ii,jj);
}
}
}