Link to this code: https://cses.fi/paste/50ce32665f45b18f269f22/
#include<bits/stdc++.h>
using namespace std;
#define endl          '\n'//notforinter
#define all(v)        v.begin(), v.end()
#define print(var)    cout << var << endl
#define rep(i, s, n)  for(int i = s; i <= n; i++)
#define rrep(i, n, s) for(int i = n; i >= s; i--)
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<vector<int>> vii;

/*****User defined function*****/
const int N = 1e5+5;
bool used[N];
set<int> g[N];
int degree[N];
vector<int> path;


void component(int u) {
    used[u] = 1;
    for(int v: g[u]) {
        if(!used[v])
            component(v);
    }
}

bool has_euler(int n) {
    rep(i, 1, n) 
        if(degree[i]&1)
            return false;

    memset(used, 0, sizeof used);
    component(1);

    rep(i, 1, n) 
        if(!used[i] && degree[i] != 0)
            return false;

    return true; 
}

void make_path(int u) {
    while(degree[u]) {
        int v = *g[u].begin();
        g[u].erase(v);
        g[v].erase(u);
        degree[u]--, degree[v]--;
        make_path(v);
    }
    path.push_back(u);
}

void solve() {
    int n, m;
    cin >> n >> m;

    rep(i, 1, m) {
        int u, v;
        cin >> u >> v;
        g[u].insert(v);
        g[v].insert(u);
        degree[u]++, degree[v]++;
    }

    if(!has_euler(n)) {
        print("IMPOSSIBLE");
        return;
    }

    make_path(1);

    while(!path.empty()) {
        cout << path.back() << " ";
        path.pop_back();
    }
}   
 
/*****main function*****/
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif 
 
    cout << fixed << showpoint;
    cout << setprecision(16);
 
    int test = 1;
    //cin >> test;
    while(test--) {
        solve();
    }
 
    return 0;
}