#include <stdio.h>
#include <vector>
using namespace std;
#define Nmax 10001
#define Mmax 30001
int N,M,i;
int x[Mmax],y[Mmax];
int was[Nmax],grad[Nmax];
vector<int> G[Nmax];
int citire()
{
freopen("drumuri.in","r",stdin);
scanf("%d %d",&N,&M);
if (M & 1) return 0;
for (i=1;i<=M;++i)
{
scanf("%d %d",&x[i],&y[i]);
G[x[i]].push_back(i);
G[y[i]].push_back(i);
++grad[x[i]];
++grad[y[i]];
}
return 1;
}
void dfs(int nod,int stra)
{
vector<int>::iterator it;
int nr=1;
was[nod]=1;
//parcurgere
for (it=G[nod].begin();it<G[nod].end();++it)
if ( (x[*it]!=nod) && (!was[x[*it]] ) )
dfs(x[*it],nod);
else
if ( (y[*it]!=nod) && (!was[y[*it]] ) )
dfs(y[*it],nod);
if ((grad[nod] & 1) == 0)
for (it=G[nod].begin();it<G[nod].end();++it)
if (x[*it]==nod)
{
if ((nr^=1)==0) printf("%d %d",y[*it],x[*it]);
else printf(" %d\n",y[*it]);
--grad[x[*it]];
--grad[y[*it]];
x[*it]=y[*it]=0;
}
else if (y[*it]==nod)
{
if ((nr^=1)==0) printf("%d %d",x[*it],y[*it]);
else printf(" %d\n",x[*it]);
--grad[x[*it]];
--grad[y[*it]];
x[*it]=y[*it]=0;
}
else ;
else
for (it=G[nod].begin();it<G[nod].end();++it)
if ((x[*it]==nod) && (y[*it]!=stra))
{
if ((nr^=1)==0) printf("%d %d",y[*it],x[*it]);
else printf(" %d\n",y[*it]);
--grad[x[*it]];
--grad[y[*it]];
x[*it]=y[*it]=0;
}
else if ((y[*it]==nod) && (x[*it]!=stra))
{
if ((nr^=1)==0) printf("%d %d",x[*it],y[*it]);
else printf(" %d\n",x[*it]);
--grad[x[*it]];
--grad[y[*it]];
x[*it]=y[*it]=0;
}
}
int main()
{
freopen("drumuri.out","w",stdout);
was[0]=1;
if (citire()) {
printf("%d\n",1);
dfs(1,0);
}
else printf("%d",0);
fclose(stdout);
fclose(stdin);
return 0;
}