#include <iostream>
#include <fstream>
#include <vector>
#define MAXN 100000
#define MAXM 500000
using namespace std;
struct Edge{
int a;
int b;
int deleted = false;
public:
int getOther(int id){
if(id == a)
return b;
return a;
}
};
vector<vector<int>> v;
int degrees[MAXN], r[MAXM], ri;
Edge edges[MAXM];
void addEdge(int id, int a, int b){
edges[id] = {a, b};
v[a].push_back(id);
v[b].push_back(id);
}
void euler(int id){
while(v[id].size() > 0){
Edge* next = &edges[v[id][v[id].size() - 1]];
v[id].pop_back();
if(!next->deleted){
next->deleted = true;
int other = next->getOther(id);
euler(other);
}
}
r[ri] = id;
ri ++;
}
int main(){
int n, m, i, j, a, b, noEdges;
ifstream fin ("ciclueuler.in");
fin >> n >> m;
v.resize(n);
for(i = 0; i < m ; i++){
fin >> a >> b;
a --;
b --;
addEdge(i, a, b);
if(a != b){
degrees[a] ++;
degrees[b] ++;
}
}
fin.close();
ofstream fout ("ciclueuler.out");
i = 0;
while (i < n && degrees[i] % 2 == 0){
i ++;
}
if(i < n){ // Exista noduri cu grad impar
fout << "-1" << endl;
} else{
ri = 0;
euler(0);
noEdges = 0;
for(i = 0; i < ri - 1; i ++)
fout <<r[i] + 1 << ' ';
fout << endl;
fout.close();
}
return 0;
}