Cod sursa(job #515238)
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 100010
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
#define MMAX 500010
struct xy{
int x,y;};
vector<int> G[NMAX];
xy v[MMAX];
bool done[MMAX];
int st[MMAX];
int grad[NMAX], cnt[NMAX];
int viz[NMAX];
int n, m, k;
inline int other(int m, int x){
return v[m].x + v[m].y - x;
}
void dfs(int x){
viz[x] = 1;
FOR(i, G[x])
if(!viz[other(*i, x)])
dfs(other(*i, x));
}
int check_eulerian() {
for(int i = 1; i <= n; ++i)
if(grad[i] % 2) return 1;
dfs(1);
for(int i = 1; i <= n; ++i)
if(!viz[i]) return 1;
return 0;
}
void euler(int nod){
st[++k] = nod;
while(k){
int x = st[k];
if(cnt[x] < (int)G[x].size()){
int muchie = G[x][cnt[x]];
if(done[muchie]){
cnt[x]++;
continue;
}
done[muchie] = 1;
cnt[x]++;
st[++k] = other(G[x][cnt[x]-1], x);
}
else {
if(k > 1) printf("%d ",x);
k--;
}
}
}
void build_sol(){
euler(1);
}
int main(){
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++i){
scanf("%d%d", &v[i].x, &v[i].y);
grad[v[i].x]++; grad[v[i].y]++;
G[v[i].x].push_back(i);
G[v[i].y].push_back(i);
}
if(check_eulerian()){
printf("-1\n");
return 0;
}
build_sol();
}