#include <bits/stdc++.h>
#define MAXN 10005
using namespace std;
struct Tarjan
{
struct edge
{
int u,v;
edge(int uu=0,int vv=0):u(uu),v(vv){}
};
int n; //点数
vector<int> e[MAXN]; //邻接表
int DFN[MAXN],LOW[MAXN];
int index;
int stk[MAXN];
int top;
vector<vector<int> > Ans; //点集¸
vector<edge> ecut; //割边
void init(int N) //初始化
{
n=N;
Ans.clear();
for(int i=1;i<=n;i++)
e[i].clear();
top=0;
index=0;
ecut.clear();
memset(DFN,-1,sizeof(DFN));
}
void AddEdge(int u,int v)
{
e[u].push_back(v);
e[v].push_back(u);
}
void DFS(int u,int prt)
{
DFN[u]=LOW[u]=++index;
stk[top++]=u;
for(int i=0;i<e[u].size();i++)
{
int &v=e[u][i];
if(v==prt)continue;
if(DFN[v]!=-1&&DFN[v]>=DFN[u])continue;
if(DFN[v]==-1)