#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define all(x) x.begin(), x.end()
#define pb push_back
#define ls (u << 1)
#define gc getchar
#define pc putchar
#define db double
#define y second
#define x first
using namespace std;
int qpow(int a, int b = mod - 2) {
int ans = 1; for (; b; b >>= 1, a = 1ll * a * a % mod)
if (b & 1) ans = 1ll * ans * a % mod; return ans;
}
void read() { return; }
template <typename T, typename ...T2>
void read(T &s, T2 &...oth) {
s = 0; char ch = gc(); bool f = 0;
for (; ch < '0' or ch > '9'; ch = gc()) if (ch == '-') f = 1;
for (; ch >= '0' and ch <= '9'; ch = gc()) s = (s << 1) + (s << 3) + (ch ^ 48);
s = f ? -s : s; read(oth...); return;
}
void write(char ch) { return; }
template <typename T, typename ...T2>
void write(char ch, T s, T2 ...oth) {
if (!s) { pc('0'); pc(ch); write(ch, oth...); return; }
int stk[100], top = 0;
if (s < 0) pc('-'), s = ~s + 1;
while (s) stk[ ++ top] = s % 10, s /= 10;
do pc(stk[top -- ] + (1 << 4) + (1 << 5)); while (top);
pc(ch); write(ch, oth...); return;
}
const int N = 1000010;
int h[N], e[N], ne[N], idx, b[N], m;
int dfn[N], sz[N], tsp, cnt, a[N], n;
int id[N], low[N], stk[N], top, f[N];
vector<int> vec[N];
bool st[N];
void add(int a, int b) {
e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
}
void tarjan(int u) {
dfn[u] = low[u] = ++ tsp;
stk[ ++ top] = u, st[u] = 1;
for (int i = h[u]; i; i = ne[i]) {
int v = e[i]; if (!dfn[v]) {
tarjan(v); low[u] = min(low[u], low[v]);
} else if (st[v]) low[u] = min(low[u], low[v]);
} if (low[u] == dfn[u]) {
int y; ++ cnt;
do {
y = stk[top -- ]; st[y] = 0;
id[y] = cnt, sz[cnt] ++ ;
vec[cnt].pb(y);
} while (y != u);
}
}
int dfs(int u) {
if (f[u]) return f[u];
for (int i = h[u]; i; i = ne[i]) {
int v = e[i];
f[u] = min(36501, dfs(v) + f[u]);
} return f[u];
}
int main() {
read(n, m);
rep(i, 1, m) read(a[i], b[i]);
rep(i, 1, m) add(a[i], b[i]);
rep(i, 1, n + 1) if (!dfn[i]) tarjan(i);
rep(i, 1, n + 1) h[i] = 0; idx = 0;
rep(i, 1, m) if (id[a[i]] ^ id[b[i]])
add(id[a[i]], id[b[i]]);
rep(i, 1, cnt) if (sz[i] > 1) f[i] = 36501;
rep(i, 1, m) if (a[i] == b[i]) f[id[a[i]]] = 36501;
if (!f[id[n + 1]]) f[id[n + 1]] = 1; int mx = 0;
rep(i, 1, cnt) if (!f[i]) dfs(i);
rep(i, 1, cnt) mx = max(mx, f[i]);
if (mx == 36501) puts("zawsze");
else printf("%d\n", mx); vector<int> ans;
rep(i, 1, cnt) if (f[i] == mx) {
for (int j : vec[i]) ans.pb(j);
} printf("%d\n", (int)ans.size());
sort(all(ans)); for (int i : ans)
if (i != n + 1) printf("%d\n", i);
}