#include<stdio.h>
#include<cstring>
using namespace std;
int n,m,viz[100002],r,vmin[100002],h[100002],f[100002],nrc,crt[100002];
struct nod
{
int v;
nod *adresa;
};
nod *a[100002];
void adaug(int x,int y)
{
nod *p;
p=new nod;
p->v=y;
p->adresa=a[x];
a[x]=p;
}
void citire()
{
int i,x,y;
scanf("%d %d",&n,&m);
memset(a,0,sizeof(a));
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
adaug(x,y);
adaug(y,x);
}
fclose(stdin);
}
int dfs(int t,int k)
{
nod *p;
int c,vvmin;
r++;
c=0;
h[k]=r;
viz[k]=1; vvmin=k;
vmin[k]=k;
for(p=a[k];p;p=p->adresa)
if(viz[p->v]==0 && p->v!=t)
{
c++;
vmin[k]=dfs(k,p->v);
if(vmin[k]<=r)
{
c--;
if(h[vmin[k]] < h[vvmin])
vvmin=vmin[k];
}
}
else
{
if(viz[p->v] && p->v!=t && h[p->v] < h[vmin[k]])
{
vmin[k]=p->v;
if(vmin[k]<vvmin)
vvmin=vmin[k];
}
}
if(c>0)
{
nrc++;
crt[nrc]=k;
f[k]=1;
}
r--;
vmin[k]=vvmin;
return vvmin;
}
int main()
{
nod *p,*q;
int i,j,ok,st[100002],poz,vmin[100002],nrm;
freopen("biconex.in","r",stdin);
freopen("biconex.out","w",stdout);
citire();
i=dfs(0,1);
nrm=0;
for(i=1;i<=nrc;i++)
for(p=a[crt[i]];p;p=p->adresa)
if(f[p->v] == 1 && crt[i] < p->v)
{
nrm++;
q=new nod;
q->v=p->v;
q->adresa=a[0];
a[0]=q;
q=new nod;
q->v=crt[i];
q->adresa=a[0];
a[0]=q;
}
printf("%d\n",2*nrm+1);
for(p=a[0];p;p=p->adresa)
{
printf("%d ",p->v);
p=p->adresa;
printf("%d\n",p->v);
}
ok=1;
memset(viz,0,sizeof(viz));
while(ok)
{
ok=0;
for(i=1;i<=n;i++)
if(viz[i]==0)
{
j=i;
ok=1;
}
for(i=1;i<=n;i++)
if(f[i])
viz[f[i]]=0;
viz[j]=1;
poz=ok;
st[1]=j;
if(ok)
printf("%d ",st[1]);
while(poz)
{
for(p=a[st[poz]];p;p=p->adresa)
if(viz[p->v]==0 && (f[st[poz]]==0 || f[p->v]==0) )
{
printf("%d ",p->v);
poz++;
viz[p->v]=1;
st[poz]=p->v;
break;
}
if(p==0)
poz--;
}
printf("\n");
}
/*for(i=1;i<=n;i++)
{
printf("%d - ",i);
for(p=a[i];p;p=p->adresa)
printf("%d ",p->v);
printf("\n");
}
for(i=1;i<=n;i++)
printf("%d ",f[i]);*/
return 0;
}