#include <bits/stdc++.h>
using namespace std;
vector<int> proc, g[100010];
bool vis[100010];
int par[100010], cycle[100010], leaf[100010];
int ini[100010], cycleCount, hasleaf[100010];
int n, dg[100010];
void foundCycle(int u) {
  int idCycle = ++cycleCount;
  ini[idCycle] = u;
  while (vis[u] == 0) vis[u] = 1, cycle[u] = idCycle, u = par[u];
}
void lenha() {
  queue<int> q;
  for (int i = 1; i <= n; ++i)
    if (!dg[i]) q.push(i), leaf[i] = vis[i] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    int v = par[u];
    proc.push_back(u);
    --dg[v];
    if (!dg[v]) q.push(v), vis[v] = 1;
  }
  cycleCount = 0;
  for (int i = 1; i <= n; ++i)
    if (!vis[i]) foundCycle(i);
  for (int i = proc.size() - 1; i >= 0; --i)
    cycle[proc[i]] = cycle[par[proc[i]]];
}
int main() {
  scanf("%d", &n);
  for (int i = 1, v; i <= n; ++i) scanf("%d", &v), par[i] = v, ++dg[v];
  lenha();
  vector<pair<int, int> > ans;
  if (cycleCount == 1) {
    for (int i = 1; i <= n; ++i)
      if (leaf[i]) ans.push_back({ini[cycle[i]], i});
  } else {
    for (int i = 1; i <= n; i++) {
      if (leaf[i]) {
        int nxt = cycle[i] + 1 > cycleCount ? 1 : cycle[i] + 1;
        ++hasleaf[cycle[i]];
        ans.push_back({ini[nxt], i});
      }
    }
    for (int i = 1; i <= cycleCount; ++i) {
      if (!hasleaf[i]) {
        int nxt = i + 1 > cycleCount ? 1 : i + 1;
        ans.push_back({ini[nxt], ini[i]});
      }
    }
  }
  printf("%lu\n", ans.size());
  for (auto a : ans) printf("%d %d\n", a.first, a.second);
  return 0;
}
