#include <bits/stdc++.h>
#define int_pair std::pair <int, int>
#define MAXN 100005
#define MAXM 500005
int N, M;
bool seen[MAXM];
std::vector <int> ADC[MAXN];
std::vector <int_pair> edges;
inline void addEdge(int x, int y) {
ADC[x].push_back(edges.size());
ADC[y].push_back(edges.size());
edges.push_back({x, y});
}
bool isEulerian() {
for (int i=1; i<=N; ++i)
if (ADC[i].size()&1)
return false;
return true;
}
std::vector <int> cycle;
std::stack <int> stack;
void buildCycle() {
stack.push(1);
int top, idx;
while (!stack.empty()) {
top = stack.top();
if (ADC[top].empty())
stack.pop(), cycle.push_back(top);
else {
idx = ADC[top].back();
ADC[top].pop_back();
if (seen[idx]) continue;
seen[idx] = 1;
stack.push(edges[idx].first + edges[idx].second - top);
}
}
}
std::ifstream input ("ciclueuler.in");
std::ofstream output("ciclueuler.out");
void readInput() {
input >> N >> M;
for (int i=1, x, y; i<=M; ++i)
input >> x >> y, addEdge(x, y);
}
void solveInput() {
if (!isEulerian()) {output << "-1\n"; return;}
buildCycle();
cycle.pop_back();
for (auto it:cycle)
output << it << ' ';
}
int main()
{
readInput();
solveInput();
return 0;
}