#include <bits/stdc++.h>
using namespace std;
vector< pair<int, int> > L[100005];
int l[100005];
int r[100005];
bool v[100005];
bool M[500005];
deque<int> q;
bool viz[100005];
void dfs(int node) {
viz[node] = true;
for(int i = 0; i < L[node].size(); i ++) {
if(!M[L[node][i].second] && !viz[L[node][i].first]) {
dfs(L[node][i].first);
}
}
}
int n;
bool pot(int a, int b) {
for(int i = 1; i <= n; i ++)
viz[i] = false;
dfs(a);
bool ok = true;
for(int i = 1; i <= n; i ++) {
if(r[i] < L[i].size())
ok &= viz[i];
}
if(ok) {
for(int i = 1; i <= n; i ++)
viz[i] = false;
dfs(b);
for(int i = 1; i <= n; i ++) {
if(r[i] < L[i].size())
ok &= viz[i];
}
if(ok)
return true;
}
return false;
}
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int k, m;
void din(int node) {
if(k == m)
return ;
k ++;
g << node << " ";
while(l[node]) {
if(!M[L[node][l[node] - 1].second])
if(pot(node, L[node][l[node] - 1].first)) {
r[node] ++;
r[L[node][l[node] - 1].first] ++;
M[L[node][l[node] - 1].second] = true;
din(L[node][l[node] - 1].first);
return ;
}
l[node] --;
}
}
int main()
{
int x, y;
f >> n >> m;
for(int i = 1; i <= m; i ++) {
f >> x >> y;
L[x].push_back(make_pair(y, i));
L[y].push_back(make_pair(x, i));
}
bool ok = true;
for(int i = 1; i <= n; i ++) {
l[i] = L[i].size();
if(l[i] & 1)
ok = false;
}
if(!ok) {
g << "-1\n";
return 0;
}
//verific conexitate
dfs(1);
for(int i = 1; i <= n; i ++)
if(!viz[i]) ok = false;
if(!ok) {
g << "-1\n";
return 0;
}
din(1);
g << "\n";
return 0;
}