#include<bits/stdc++.h>
using namespace std;
using i64=long long;
constexpr int inf=1e9;
int main(){
int n,m;
cin>>n>>m;
vector<vector<int> >g(n);
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
--u,--v;
if(u==v) continue;
g[u].push_back(v);
g[v].push_back(u);
}
vector<int>dfn(n),low(n),cut(n);
stack<int>st;
int T=0,cnt=0;
vector<vector<int> >bcc(n);
auto tarjan=[&](auto self,int u)=>void{
dfn[u]=low[u]=++T;
st.push(u);
if(u==rt&&g[u].size()==0){
bcc[cnt].push_back(u);
cnt++;
return;
}
int tt=0;
for(auto v:g[u]){
if(!dfn[v]){
self(self,v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
++tt;
if(u!=rt||tt>1){
cut[u]=true;
}
int x;
do{
x=st.top();
st.pop();
bcc[cnt].push_back(x);
ng[x].push_back(n+cnt);
cnt++;
}
}
}else{
low[u]=min(low[u],dfn[v]);
}
}
}
}