#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<vector<int>> g(n + 1);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
}
vector<int> d(n + 1, 0), l(n + 1, 0), s;
vector<bool> b(n + 1, false);
vector<vector<int>> c;
int t = 0;
auto f1 = [&](auto self, int u) -> void {
d[u] = l[u] = ++t;
s.push_back(u);
b[u] = true;
for (int v : g[u]) {
if (d[v] == 0) {
self(self, v);
l[u] = min(l[u], l[v]);
} else if (b[v]) {
l[u] = min(l[u], d[v]);
}
}
if (l[u] == d[u]) {
vector<int> sc;
while (true) {
int v = s.back();
s.pop_back();
b[v] = false;
sc.push_back(v);
if (u == v) {
break;
}
}
c.push_back(sc);
}
};
for (int i = 1; i <= n; i++) {
if (d[i] == 0) {
f1(f1, i);
}
}
int si = -1;
for (int i = 0; i < (int)c.size(); i++) {
if (c[i].size() > 1) {
si = i;
break;
}
}
if (si == -1) {
cout << 0 << '\n';
return 0;
}
vector<int> w = c[si];
vector<bool> p(n + 1, false);
for (int u : w) {
p[u] = true;
}
auto f2 = [&](int su, int sv) {
vector<int> id(n + 1, 0);
for (int u : w) {
for (int v : g[u]) {
if (!p[v]) {
continue;
}
if (u == su && v == sv) {
continue;
}
id[v]++;
}
}
queue<int> k;
for (int u : w) {
if (id[u] == 0) {
k.push(u);
}
}
int ct = 0;
while (!k.empty()) {
int u = k.front();
k.pop();
ct++;
for (int v : g[u]) {
if (!p[v]) {
continue;
}
if (u == su && v == sv) {
continue;
}
if (--id[v] == 0) {
k.push(v);
}
}
}
int sz = w.size();
return ct == sz;
};
vector<int> o(n + 1, 0), r;
auto f3 = [&](auto self, int su, int sv, vector<int>& res) -> bool {
for (int u : w) {
o[u] = 0;
}
r.clear();
auto dfs = [&](auto self2, int u) -> bool {
o[u] = 1;
r.push_back(u);
for (int v : g[u]) {
if (!p[v]) {
continue;
}
if (u == su && v == sv) {
continue;
}
if (o[v] == 1) {
bool f = false;
for (int x : r) {
if (x == v) {
f = true;
}
if (f) {
res.push_back(x);
}
}
return true;
}
if (o[v] == 0 && self2(self2, v)) {
return true;
}
}
o[u] = 2;
r.pop_back();
return false;
};
for (int u : w) {
if (o[u] == 0 && dfs(dfs, u)) {
return true;
}
}
return false;
};
vector<int> y;
f3(f3, -1, -1, y);
vector<pair<int, int>> z;
for (int i = 0; i < (int)y.size(); i++) {
z.push_back({y[i], y[(i + 1) % y.size()]});
}
pair<int, int> be = {-1, -1};
while (!z.empty()) {
pair<int, int> e = z.back();
z.pop_back();
if (f2(e.first, e.second)) {
be = e;
break;
}
vector<int> n2;
f3(f3, e.first, e.second, n2);
vector<int> sc(n + 1, 0);
for (int i = 0; i < (int)n2.size(); i++) {
sc[n2[i]] = n2[(i + 1) % n2.size()];
}
vector<pair<int, int>> nc;
for (auto& ee : z) {
if (sc[ee.first] == ee.second) {
nc.push_back(ee);
}
}
z = nc;
}
int ux = be.first, uy = be.second;
vector<int> j(n + 1, 0);
for (int u = 1; u <= n; u++) {
for (int v : g[u]) {
if (u == ux && v == uy) {
continue;
}
j[v]++;
}
}
queue<int> k;
vector<int> v;
for (int i = 1; i <= n; i++) {
if (j[i] == 0) {
k.push(i);
}
}
while (!k.empty()) {
int u = k.front();
k.pop();
v.push_back(u);
for (int nxt : g[u]) {
if (u == ux && nxt == uy) {
continue;
}
if (--j[nxt] == 0) {
k.push(nxt);
}
}
}
ll m1 = 1000000007, m2 = 1000000009;
vector<ll> a(n + 1, 0), b(n + 1, 0), e(n + 1, 0), f(n + 1, 0);
a[uy] = 1;
b[uy] = 1;
for (int u : v) {
for (int nxt : g[u]) {
if (u == ux && nxt == uy) {
continue;
}
a[nxt] = (a[nxt] + a[u]) % m1;
b[nxt] = (b[nxt] + b[u]) % m2;
}
}
e[ux] = 1;
f[ux] = 1;
for (int i = (int)v.size() - 1; i >= 0; i--) {
int u = v[i];
for (int nxt : g[u]) {
if (u == ux && nxt == uy) {
continue;
}
e[u] = (e[u] + e[nxt]) % m1;
f[u] = (f[u] + f[nxt]) % m2;
}
}
ll h = a[ux], i = b[ux];
vector<pair<int, int>> as;
as.push_back({ux, uy});
for (int u : w) {
for (int nxt : g[u]) {
if (u == ux && nxt == uy) {
continue;
}
if (!p[nxt]) {
continue;
}
if ((a[u] * e[nxt]) % m1 == h && (b[u] * f[nxt]) % m2 == i) {
as.push_back({u, nxt});
}
}
}
cout << as.size() << '\n';
for (auto& edge : as) {
cout << edge.first << ' ' << edge.second << '\n';
}
return 0;
}