#include<stdio.h>
#include<stdlib.h>
#define N 100001
#define M 500001
typedef struct stack
{long st[N],sp;};
typedef struct nod
{long info;
nod *leg;}Nod,*list;
long a,b,i,j,k,n,m,s[N]={0};
list l,p,g[N];
stack q;
void push(stack &q,long x)
{q.st[++q.sp]=x;}
long pop(stack &q)
{return q.st[q.sp--];}
void add(list &q,long x)
{Nod *nou=new Nod;
nou->info=x;
nou->leg=q;
q=nou;}
int contine(list &q,long x)
{Nod *p;
for(p=q;p!=NULL;p=p->leg)
if(p->info==x)
return 1;
return 0;}
void del(list &l,long x)
{Nod *p=l,*q=l;
while(p!=NULL&&p->info!=x)
{q=p;
p=p->leg;}
if(p!=NULL)
{if(q==p)
l=l->leg;
else
q->leg=p->leg;
free(p);}}
void ciclu(list v)
{long i;
list baza,urm,gas;
urm=v->leg;
baza=v;
do
{if(contine(g[g[baza->info]->info],baza->info)==1&&contine(g[baza->info],g[baza->info]->info)==1)
{i=g[baza->info]->info;
del(g[baza->info],i);
del(g[i],baza->info);
gas=new Nod;
gas->info=i;
gas->leg=NULL;
baza->leg=gas;
baza=gas;}}
while(gas->info!=v->info);
baza->leg=urm;}
int adauga(list p,list l,list g[N])
{int gasit=0;
p=l;
while(p!=NULL&&!gasit)
{if(g[p->info]!=NULL)
gasit=1;
if(!gasit)
p=p->leg;}
if(p!=NULL)
{ciclu(p);
return 1;}
else
return 0;}
int grade_pare(list g[N],long n)
{long i=1,s=0;
list p;
int gasit=0;
while(i<=n&&!gasit)
{for(p=g[i];p!=NULL;p=p->leg)
s++;
if(s%2==1)
gasit=1;
i++;}
return (!gasit);}
void df(list g[N],long i)
{long j;
list p;
stack q;
q.sp=0;
push(q,i);
while(q.sp!=0)
{j=pop(q);
s[j]=1;
for(p=g[j];p!=NULL;p=p->leg)
if(s[p->info]==0)
push(q,p->info);}}
int conex(list g[N],long s[N])
{long i;
int gasit=0;
df(g,1);
for(i=1;i<=n;i++)
if(s[i]==0)
gasit=1;
return (!gasit);}
int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%ld%ld\n",&n,&m);
for(j=1;j<=n;j++)
g[j]=NULL;
for(i=1;i<=m;i++)
{scanf("%ld%ld\n",&a,&b);
add(g[a],b);
add(g[b],a);}
if(conex(g,s)==1&&grade_pare(g,n)==1)
{l=new Nod;
l->info=1;
l->leg=NULL;
while(adauga(p,l,g)==1)
{for(p=l->leg;p!=NULL;p=p->leg)
printf("%ld ",p->info);}}
else
printf("-1");
fclose(stdin);
fclose(stdout);
return 0;}