namespace EDCC
{
struct edge{int nex,to;}e[MAX<<1];
int head[MAX],cnt=1;
inline void add(int x,int y) {e[++cnt].nex=head[x],head[x]=cnt,e[cnt].to=y;}
inline void Add(int x,int y) {add(x,y),add(y,x);}
int dfn[MAX],low[MAX],tot;
int bridge[MAX<<1],col[MAX],num;
vector<int> edcc[MAX];
void tarjan(int now,int nowi)
{
dfn[now]=low[now]=++tot;
for(int i=head[now],to=e[i].to;i;i=e[i].nex,to=e[i].to)
if(!dfn[to])
{
tarjan(to,i),cmin(low[now],low[to]);
if(low[to]>dfn[now]) bridge[i]=bridge[i^1]=1;
}
else if(i!=(nowi^1)) cmin(low[now],dfn[to]);
}
void dfs(int now)
{
col[now]=num;
if(now) edcc[num].eb(now);
for(int i=head[now],to=e[i].to;i;i=e[i].nex,to=e[i].to) if(!col[to]&&!bridge[i]) dfs(to);
}
}