/*
  Copyright 2015 Marek "p2004a" Rusinowski
  Finding Euler cycle, Hierholzer's algorithm
*/
#include <cstdio>
#include <vector>

using namespace std;

constexpr int MAXN = 1000000;

vector<pair<int, int>> edges[MAXN];
bool used_edge[MAXN];
vector<int> cycle;

void euler(int v) {
    while (!edges[v].empty()) {
        auto u = edges[v].back();
        edges[v].pop_back();
        if (used_edge[u.second]) continue;
        used_edge[u.second] = true;
        euler(u.first);
        cycle.push_back(v);
    }
}

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int a, b;
        scanf("%d%d", &a, &b);
        edges[--a].emplace_back(--b, i);
        edges[b].emplace_back(a, i);
    }

    for (int i = 0; i < n; ++i) {
        if (edges[i].size() % 2 == 1) {
            printf("NO\n");
            return 0;
        }
    }

    euler(0);
    for (int i: cycle) {
        printf("%d ", i + 1);
    }
    printf("\n");
}
