#include<fstream.h>
#define N 100001
typedef struct nod
{long info;
struct nod *urm;}Nod,*list;
long a[5*N],b[5*N],d[5*N],i,n,m,k,deg[N]={0},*g[N],j,c[N]={0},t;
Nod *l,*r;
void ciclu(long *g[N],long deg[N],list &l)
{long i,t,e,f;
Nod *ab=l,*ag,*au=l->urm;
do
{for(i=0;i<deg[ab->info];i++)
{j=g[ab->info][i],k=i;
break;}
for(e=k;e<deg[ab->info]-1;e++)
g[ab->info][e]=g[ab->info][e+1];
deg[ab->info]--;
for(t=0;t<deg[j];t++)
if(g[j][t]==ab->info)
{k=t;
break;}
for(f=k;f<deg[j]-1;f++)
g[j][f]=g[j][f+1];
deg[j]--;
ag=new Nod;
ag->info=j;
ag->urm=NULL;
ab->urm=ag;
ab=ag;}
while(ag->info!=l->info);
ab->urm=au;}
int adauga(long *g[N],long deg[N],list &l)
{long gasit=0;
Nod *p=l;
while(p!=NULL&&gasit==0)
{if(deg[p->info]>0)
gasit=1;
if(!gasit)
p=p->urm;}
if(p!=NULL)
{ciclu(g,deg,p);
return 1;}
else
return 0;}
int gp(long *g[N],long deg[N])
{long i,gasit=0;
for(i=1;i<=n&&gasit==0;i++)
if(deg[i]%2==1)
gasit=1;
return (!gasit);}
void df(long *g[N],long deg[N],long k)
{long i,sp=0,st[N];
st[++sp]=k;
c[k]=1;
while(sp>0)
{j=st[sp--];
for(i=0;i<deg[j];i++)
if(c[g[j][i]]==0)
c[g[j][i]]=1,st[++sp]=g[j][i];}}
int conex(long *g[N],long deg[N],long n)
{long i,gasit=0;
df(g,deg,1);
for(i=1;i<=n;i++)
if(c[i]==0)
gasit=1;
return (!gasit);}
int main()
{ifstream x("ciclueuler.in");
ofstream y("ciclueuler.out");
x>>n>>m;
for(i=1;i<=m;i++)
{x>>a[i]>>b[i];
deg[a[i]]++,deg[b[i]]++;}
for(i=1;i<=n;deg[i++]=0)
g[i]=(long*)malloc(deg[i]*sizeof(long));
for(i=1;i<=m;i++)
{g[a[i]][deg[a[i]]++]=b[i];
g[b[i]][deg[b[i]]++]=a[i];}
if(conex(g,deg,n)==0||gp(g,deg)==0)
y<<"-1";
else
{l=new Nod;
l->info=1;
l->urm=NULL;
while(adauga(g,deg,l)==1);
for(r=l->urm;r!=NULL;r=r->urm)
y<<r->info<<" ";}
x.close();
y.close();
return 0;}