#include <bits/stdc++.h>
#define nmax 100007
#define mmax 500007
using namespace std;
int n;/// nr de noduri
int st[mmax], dr[mmax], m;
/**
st[i] - capatul din stanga a muchiei
dr[i] - capatul din dreapta a muchiei
m - nr de muchii
*/
vector <int>L[nmax]; /// L[i] - memoreaza numarul muchiei legat de i
bool viz[mmax]; /// contorul muchiilor vizitate
int cicluEuler[mmax], lung; /// ciclul eulerian
int poz[nmax];/// poz[i] - pozitia unde am ramas in lista de adiacenta L[i]
void Citire()
{
ifstream fin ("ciclueuler.in");
fin >> n >> m;
for (int i=1; i<=m; i++)
{
fin >> st[i] >> dr[i];
L[st[i]].push_back(i);
L[dr[i]].push_back(i);
}
fin.close();
}
int VerificareNrMuchiiPare()
{
int i;
/// verificare daca exista nr par de noduri
/// cu un nr impar de muchii
for (i=1; i<=n; i++)
if (L[i].size() % 2 == 1) return 0;
return 1;
}
inline void DFS(int nod)
{
while (poz[nod] < L[nod].size())
{
int k = L[nod][poz[nod]++];
if (!viz[k])
{
viz[k]=1;
DFS(st[k] + dr[k] - nod);
}
}
cicluEuler[++lung] = nod;
}
void GrafEulerian()
{
ofstream fout ("ciclueuler.out");
if (!VerificareNrMuchiiPare()) fout << "-1\n";
else
{
DFS(1);
for (int i=1; i<lung; i++)
fout << cicluEuler[i] << " ";
fout << "\n";
}
fout.close();
}
int main()
{
Citire();
GrafEulerian();
return 0;
}