8
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define PB push_back
typedef long long LL;
int N,M,tot;
int First[100009],Next[100009],Node[100009];
int H[100009],Low[100009];
bool Cut[100009],vis[100009];
vector<int> CutSet;
LL Answer1,Answer2,Num,CutNum;
void Dfs(int fa,int x)
{
H[x]=Low[x]=H[fa]=1;
int child=0;
for(int e=First[x];e!=-1;e=Next[e])
{
if(H[Node[e]]==-1)
{
Dfs(x,Node[e]);
Low[x]=min(Low[x],Low[Node[e]]);
child++;
}
else if(Node[e]!=fa)
{
if(H[Node[e]]<H[x])
Low[x]=min(Low[x],H[Node[e]]);
else
Low[x]=min(Low[x],Low[Node[e]]);
}
}
if(x==1)
{
if(child>1)
Cut[x]=true;
else
Cut[x]=false;
}
else
{
Cut[x]=false;
for(int e=First[x];e!=-1;e=Next[e])
if(H[Node[e]]==H[x]+1)
if(Low[Node[e]]>=H[x])
Cut[x]=true;
}
}
void AddEdge(int u,int v)
{
Node[++tot]=v;
Next[tot]=First[u];
First[u]=tot;
}
void Init()
{
N=0;tot=0;
for(int i=1;i<=100000;i++)
First[i]=-1;
while(M--)
{
int u,v;
cin>>u>>v;
N=max(u,N);
N=max(v,N);
AddEdge(u,v);
AddEdge(v,u);
}
H[0]=0;
for(int i=1;i<=N;i++)
H[i]=-1;
Dfs(0,1);
}
void Find(int x)
{
if(Cut[x])
{
CutSet.PB(x);
return;
}
if(vis[x])
return;
Num++;
for(int e=First[x];e!=-1;e=Next[e])
Find(Node[e]);
}
void Solve()
{
for(int i=1;i<=N;i++)
vis[i]=false;
Answer1=0;
Answer2=1;
for(int i=1;i<=N;i++)
if(!Cut[i]&&!vis[i])
{
Num=0;
CutSet.clear();
Find(i);
sort(CutSet.begin(),CutSet.end());
CutSet.erase(unique(CutSet.begin(),CutSet.end()),CutSet.end());
CutNum=CutSet.size();
if(CutNum>=2);
else if(CutNu