#include <fstream>
#include <vector>
#include <stack>
#include <cstdlib>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
struct muchie {
int x, y;
bool viz;
};
#define NMAX 100005
int n, m;
vector<muchie> muchii;
vector<int> vecini[NMAX];
stack<int> st;
vector<int> v_afisare;
void citire() {
f >> n >> m;
int x, y;
for (int i = 0; i < m; ++i) {
f >> x >> y;
muchii.push_back({x, y, false});
vecini[x].push_back(i);
vecini[y].push_back(i);
}
}
void stergere_muchii_utilizate(int x) {
while (!vecini[x].empty() && muchii[vecini[x][vecini[x].size() - 1]].viz)
vecini[x].pop_back();
}
int gasire_vecin(int nr_muchie, int x) {
if (x == muchii[nr_muchie].x)
return muchii[nr_muchie].y;
return muchii[nr_muchie].x;
}
int alegere_urmatorul_vecin(int x) {
stergere_muchii_utilizate(x);
if (vecini[x].empty()) {
g << -1;
exit(0);
}
int nr_muchie = vecini[x][vecini[x].size() - 1];
muchii[nr_muchie].viz = true;
int y = gasire_vecin(nr_muchie, x);
vecini[x].pop_back();
st.push(y);
return y;
}
void cautare_ciclu_eulerian() {
while (!st.empty()) {
int x = st.top();
stergere_muchii_utilizate(x);
if (vecini[x].empty()) {
v_afisare.push_back(x);
st.pop();
continue;
}
int y = alegere_urmatorul_vecin(x);
while (x != y)
y = alegere_urmatorul_vecin(y);
}
}
void verificare_ramase() {
for (auto &much: muchii)
if (!much.viz) {
g << -1;
exit(0);
}
}
void afisare() {
for (int i = v_afisare.size() - 1; i > 0; i--)
g << v_afisare[i] << ' ';
}
int main() {
citire();
st.push(1);
cautare_ciclu_eulerian();
verificare_ramase();
afisare();
}