#include<bits/stdc++.h>
using namespace std;
int n,m,top,color_num;
vector<int>g[100010];
struct edge
{
int s,t;
};
int low[100010],dfn[100010],color[100010];
stack<edge>my_stack;
vector<edge>ans;
bool is_cut[100010];
int cnt=0;
//寻找无向图的割顶(删除此点后图不连通)
void find_cut(int x,int pre)
{
int child=0;
low[x]=dfn[x]=++cnt;
for(int i=0;i<g[x].size();i++)
{
int to=g[x][i];
if(to==pre)continue;
if(!dfn[to])
{
child++;
find_cut(to,x);
low[x]=min(low[x],low[to]);
if(low[to]>=dfn[x])is_cut[x]=true;
}
else if(dfn[to]<dfn[x])low[x]=min(low[x],dfn[to]);
}
if(pre==-1&&child==1)is_cut[x]=false;
return;
}
//寻找无向图的桥(删除此边后图不联通)
void find_bridge(int x,int pre)
{
dfn[x]=low[x]=++cnt;
int to;
for(int i=0;i<g[x].size();i++)
{
to=g[x][i];
if(to==pre)continue;
if(!dfn[to])
{
find_bridge(to,x);
low[x]=min(low[x],low[to]);
if(low[to]>dfn[x])ans.push_back((edge){x,to});
}
else low[x]=min(low[x],dfn[to]);
}
return;
}
int main()
{
cin>>n>>m;
int a,b;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
return 0;
}