OI VIII - spo

// https://szkopul.edu.pl/problemset/problem/PaOm0b0Z7CvBDSQxwd1ItSP8/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long
constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector
typedef vec<vec<int>> _kra;

namespace two_sat {

#ifndef GARY_LIB
#include <bits/stdc++.h>
#endif

int neg(int v, int n) {
    if (v > n) {
        return v - n;
    } else {
        return v + n;
    }
}

std::vector<int> post;
int visited[sizik];
int visited_curr = 1;

void DFS(int v, const _kra& kra) {
    if (visited[v] == visited_curr) return;
    visited[v] = visited_curr;
    for (const auto& u : kra[v]) {
        DFS(u, kra);
    }
    post.push_back(v);
}

std::vector<std::vector<int>> SSS;
int idx_of_sss[sizik];
void DFS1(int v, const _kra& kra1) {
    if (visited[v] == visited_curr) return;
    visited[v] = visited_curr;
    SSS.back().push_back(v);
    idx_of_sss[v] = (int)SSS.size() - 1;
    for (const auto& u : kra1[v]) {
        DFS1(u, kra1);
    }
}

std::vector<int> topo_order;
void DFS_TOPO(int v, const _kra& kra_sss) {
    if (visited[v] == visited_curr) return;
    visited[v] = visited_curr;
    for (const auto& u : kra_sss[v]) {
        DFS_TOPO(u, kra_sss);
    }
    topo_order.push_back(v);
}

std::vector<bool> two_sat(const std::vector<ar<int, 2>>& cond, int n) {
    _kra kra(2 * n + 3);
    _kra kra1(2 * n + 3);
    for (auto [a, b] : cond) {
        if (a < 0) a = neg(-a, n);
        if (b < 0) b = neg(-b, n);

        kra[neg(a, n)].push_back(b);
        kra[neg(b, n)].push_back(a);

        kra1[b].push_back(neg(a, n));
        kra1[a].push_back(neg(b, n));
    }

    visited_curr++;
    for (int i = 1; i <= 2 * n; i++) {
        if (visited[i] != visited_curr) DFS(i, kra);
    }
    visited_curr++;
    std::reverse(post.begin(), post.end());
    for (const auto& v : post) {
        if (visited[v] != visited_curr) {
            SSS.push_back({});
            DFS1(v, kra1);
        }
    }

    for (int i = 1; i <= n; i++) {
        if (idx_of_sss[i] == idx_of_sss[neg(i, n)]) {
            std::vector<bool> empty_vector;
            return empty_vector;
        }
    }

    _kra SSS_kra(SSS.size());
    for (int v = 1; v <= 2 * n; v++) {
        int from = idx_of_sss[v];
        for (auto u : kra[v]) {
            int to = idx_of_sss[u];
            if (from != to) {
                SSS_kra[from].push_back(to);
            }
        }
    }
    for (auto& vc : SSS_kra) {
        std::sort(vc.begin(), vc.end());
        vc.erase(std::unique(vc.begin(), vc.end()), vc.end());
    }

    visited_curr++;
    for (int i = 0; i < (int)SSS.size(); i++) {
        if (visited[i] != visited_curr) DFS_TOPO(i, SSS_kra);
    }

    std::reverse(topo_order.begin(), topo_order.end());

    std::vector<int> topo_weights(SSS.size());
    for (int i = 0; i < (int)topo_order.size(); i++) {
        topo_weights[topo_order[i]] = i;
    }

    std::vector<bool> ret(n);
    for (int i = 1; i <= n; i++) {
        if (topo_weights[idx_of_sss[i]] < topo_weights[idx_of_sss[neg(i, n)]]) {
            ret[i - 1] = false;
        } else {
            ret[i - 1] = true;
        }
    }
    return ret;
}

}

void solve() {
    using two_sat::neg;

    int n, m;
    std::cin >> n >> m;

    std::vector<ar<int, 2>> cond;

    int N = 2 * n;

    for (int i = 1; i <= 2 * n; i += 2) {
        cond.push_back({i, i + 1});
        cond.push_back({-i, -(i + 1)});
    }

    for (int i = 0; i < m; i++) {
        int a, b;
        std::cin >> a >> b;

        cond.push_back({-a, -b});
    }

    auto ret = two_sat::two_sat(cond, N);

    if (ret.empty()) {
        std::cout << "NIE\n";
        return;
    }

    for (int i = 0; i < ret.size(); i++) {
        if (ret[i]) {
            std::cout << (i + 1) << '\n';
        }
    }
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}