#include <bits/stdc++.h>
using namespace std;
const int MAXM = 1e5 + 5;
const int MAXN = 1e6 + 5;
const int INF = 1e7 + 9;
const int MOD = 1e9 + 9;
const int MX = 1e9;
vector<int> g[MAXM], g2[MAXM], order, comp;
pair<int, int> pr[MAXM];
int used[MAXM], u[MAXM], us[MAXM], x;
bool ok;
void top_sort(int v) {
  u[v] = true;
  for (int i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (!u[to]) top_sort(to);
  }
  order.push_back(v);
}
void check(int v) {
  us[v] = true;
  comp.push_back(v);
  for (int i = 0; i < g2[v].size(); ++i) {
    int to = g2[v][i];
    if (!us[to]) check(to);
  }
}
void dfs(int v, int p = -1) {
  if (p == -1 && !used[v]) {
    ++x;
    pr[x].first = v;
  }
  comp.push_back(v);
  used[v] = true;
  for (int i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (!used[to]) {
      dfs(to, v);
    }
  }
  if (!ok) {
    pr[x].second = v;
    ok = 1;
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    int X;
    cin >> X;
    g[i].push_back(X);
    g2[X].push_back(i);
  }
  for (int i = 1; i <= n; ++i) {
    if (!u[i]) top_sort(i);
  }
  for (int i = order.size() - 1; i >= 0; --i) {
    comp.clear();
    if (!us[order[i]]) check(order[i]);
    if (comp.size() == n) return (cout << 0, 0);
  }
  for (int i = order.size() - 1; i >= 0; --i) {
    ok = false;
    int ver = order[i];
    if (!used[ver]) dfs(ver);
  }
  cout << x << "\n";
  for (int i = 1; i <= x; ++i) {
    if (i != x)
      cout << pr[i].second << " " << pr[i + 1].first << "\n";
    else
      cout << pr[i].second << " " << pr[1].first << "\n";
  }
}
