#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#define N 10010
using namespace std;
vector<long int> head[N];
stack<long int> way;
long int n;
bool visited[N][N];
bool vis[N];
long long int d[N];
void addEdge(long int x,long int y) {
head[x].push_back(y);
head[y].push_back(x);
d[x]++;
d[y]++;
}
void dfs(int u) {
vis[u]=1;
vector<long int>::iterator pos;
for(pos=head[u].begin(); pos!=head[u].end(); pos++) {
long int v=*pos;
if(!vis[v]) {
dfs(v);
}
}
}
void euler(long int u) {
vector<long int>::iterator pos;
//利用dfs的方法遍历所有的边
for(pos=head[u].begin(); pos!=head[u].end(); pos++) {
long int v=*pos;
if(!visited[u][v]) {
visited[u][v]=visited[v][u]=1;
//我这里不用栈,而是在进行下一个点之前就把当前点输出,样例是过了,可是交上去只能得10分
//cout<<' '<<v;
euler(v);
//用栈的话就没问题,可以得90分。
way.push(v);
}
}
}
int main() {
long long int m;
cin>>n>>m ;
while(m--) {
long int x,y;
cin>>x>>y;
addEdge(x,y);
}
//以前总是得90分的原因就是没有考虑图不连通的情况
//这里从第一个点出发dfs所有的点,最后检验即可
dfs(1);
bool flag=0;
for(int i=1; i<=n; i++)
if(vis[i]==0) {
flag=1;
break;
}
//如果是不连通的,直接输出-1
if(flag==1) cout<<-1;
else {
long long int odd_num=0;
for(long int i=1; i<=n; i++) {
sort(head[i].begin(),head[i].end());
if(d[i]%2)
odd_num++;
}
if(odd_num>2)
cout<<-1;
else {
cout<<1;
euler(1);
while(!way.empty()) {
cout<<' '<<way.top();
way.pop();
}
}
}
return 0;
}