#include typedef long long ll; typedef long double ld; using namespace std; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) int N; vector> Gfull; vector> g; vector SCC; stack S; vector cislo, najmenej; vectorspracuvam; int cas, nSCC; void hladaj(int v) { cislo[v] = najmenej[v] = cas++; S.push(v); spracuvam[v] = true; for (int i = 0; i> n >> m) { Gfull = {}; Gfull.resize(n); SCC = {}; SCC.resize(n, -1); cislo = {}; cislo.resize(n, -1); najmenej = {}; najmenej.resize(n, -1); spracuvam = {}; spracuvam.resize(n, false); while (!S.empty()) S.pop(); cas = nSCC = 0; rep(i, 0, m) { int a, b; cin >> a >> b; a--, b--; Gfull[a].push_back(b);; } rep(i, 0, n) if (SCC[i] == -1) hladaj(i); vector repr(nSCC); rep(i, 0, n) repr[SCC[i]] = i; g = {}; g.resize(nSCC); vector > gset(nSCC); rep(i, 0, n) for (auto a : Gfull[i]) if (SCC[i] != SCC[a]) gset[SCC[i]].insert(SCC[a]); /*****************************/ n = nSCC; rep(i, 0, n) for (auto a : gset[i]) g[i].push_back(a); vector in, out; vector isout(n, true); rep(i,0,n) { if(g[i].size() == 0) { in.push_back(i); } for(auto x : g[i]) { isout[x] = false; } } rep(i,0,n) { if(isout[i]) out.push_back(i); } random_shuffle(in.begin(), in.end()); random_shuffle(out.begin(), out.end()); cout << max(in.size(), out.size()) << endl; rep(i,0,max(in.size(), out.size())) { cout << (repr[in[i%in.size()]]+1) << " " << (repr[out[i%out.size()]]+1) << endl; } } return 0; }