#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
const int MMAX=5e5, NMAX=1e5;
vector<int> graph[MMAX+5], ciclu;
vector<pair<int,int> > muchii(NMAX+5);
vector<bool> used(NMAX+5), used_edge(MMAX+5);
int n, m;
void dfs_euler(int nod){
stack<int> s;
s.push(nod);
while(!s.empty()){
nod=s.top();
if(graph[nod].size()){
int vecin=graph[nod].back();
graph[nod].pop_back();
if(used_edge[vecin]==0){
used_edge[vecin]=1;
int index_vecin=muchii[vecin].first^muchii[vecin].second^nod;
s.push(index_vecin);
}
}else{
s.pop();
ciclu.push_back(nod);
}
}
}
void dfs(int nod){
used[nod]=1;
for(auto it:graph[nod]){
int next=muchii[it].first^muchii[it].second^nod;
if(used[next]==0){
dfs(next);
}
}
}
bool is_eulerian(){
dfs(1);
for(int i=1;i<=n;i++){
if(used[i]==0){
return false;
}
}
for(int i=1;i<=n;i++){
if(graph[i].size()%2==1){
return false;
}
}
return true;
}
int main(){
fin>>n>>m;
for(int i=1;i<=m;i++){
int x, y;
fin>>x>>y;
graph[x].push_back(i);
graph[y].push_back(i);
muchii[i].first=x;
muchii[i].second=y;
}
if(is_eulerian){
dfs_euler(1);
for(int i=0;i<ciclu.size()-1;i++){
fout<<ciclu[i]<<' ';
}
}else{
fout<<-1;
}
}