#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; vector<int> G[maxn]; int DFN[maxn], LOW[maxn], index, cnt; int ans[maxn], belong[maxn]; bool vis[maxn]; stack<int> S; void Tarjan(int u) { DFN[u] = LOW[u] = ++index; S.push(u); int v; vis[u] = true; for (int i = 0; i < G[u].size(); i++) { v = G[u][i]; if (DFN[v] == 0) { Tarjan(v); LOW[u] = min(LOW[u], LOW[v]); } else if (vis[v]) LOW[u] = min(LOW[u], DFN[v]); } if (DFN[u] == LOW[u]) { cnt++; do { v = S.top(); S.pop(); vis[v] = false; ans[cnt]++; belong[v] = cnt; } while (u != v); } } int main() { //freopen("in", "r", stdin); int n, m, u, v; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> u >> v; G[u].push_back(v); } for (int i = 1; i <= m; i++) { if (DFN[i] == 0) Tarjan(i); } cout << cnt << endl; for (int i = 1; i <= m; i++) { cout << i << " " << belong[i] << endl; } }