OI XXIII - dro

// https://szkopul.edu.pl/problemset/problem/9TaxfuNdAv2FPpQ6PeB-vlti/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

constexpr int sizik = 1000 * 1001;

int rp[sizik], cnt = 0, vis1 = 1;

std::vector<int> kra[sizik], kra1[sizik], kra2[sizik], kra3[sizik], post;
int visited[sizik];

std::bitset<sizik> isGood1, isGood2;
int cl[sizik];

void DFS(int v) {
    if (visited[v] == vis1) {
        return;
    }

    visited[v] = vis1;

    for (const auto& u : kra[v]) {
        DFS(u);
    }

    post.push_back(v);
}

void DFS1(int v) {
    if (visited[v] == vis1) {
        return;
    }

    visited[v] = vis1;
    rp[v] = cnt;

    for (const auto& u : kra1[v]) {
        DFS1(u);
    }
}

void DFS2(int v, int prev) {
    if (rp[v] != rp[prev]) {
        kra2[rp[prev]].push_back(rp[v]);
        kra3[rp[v]].push_back(rp[prev]);
    }

    if (visited[v] == vis1) {
        return;
    }

    visited[v] = vis1;

    for (const auto& u : kra[v]) {
        DFS2(u, v);
    }
}

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

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

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

        kra[a].push_back(b);
        kra1[b].push_back(a);
    }

    vis1++;
    for (int i = 1; i <= n; i++) {
        if (visited[i] != vis1) {
            DFS(i);
        }
    }

    vis1++;
    for (int i = post.size() - 1; i >= 0; i--) {
        if (visited[post[i]] != vis1) {
            cnt++;
            DFS1(post[i]);
        }
    }

    vis1++;
    for (int i = 1; i <= n; i++) {
        if (visited[i] != vis1) {
            DFS2(i, i);
        }
    }

    int maxi = 0;
    for (int i = 1; i <= cnt; i++) {
        cl[i] = INT_MAX;
        for (const auto& a : kra2[i]) {
            cl[i] = std::min(cl[i], a);
        }

        if (maxi <= i) {
            isGood1[i] = true;
        }

        maxi = std::max(maxi, cl[i]);
    }

    int mini = INT_MAX;
    for (int i = cnt; i >= 1; i--) {
        cl[i] = 0;
        for (const auto& a : kra3[i]) {
            cl[i] = std::max(cl[i], a);
        }

        if (mini >= i) {
            isGood2[i] = true;
        }

        mini = std::min(mini, cl[i]);
    }

    std::vector<int> ans;

    for (int i = 1; i <= n; i++) {
        if (isGood1[rp[i]] && isGood2[rp[i]]) {
            ans.push_back(i);
        }
    }

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

    return 0;
}