#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 50;
const int M = 1e6;
const int oo = 1e9;
const int mod = 1e9 + 7;
int idx[N], low[N], T, gid[N], cmp, gh[N], p[N], gsz[N], gst[N], st;
vector<int> s, g[N];
bool vis[N], f;
void dfs(int u) {
  idx[u] = low[u] = ++T;
  s.push_back(u);
  vis[u] = 1;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (!idx[v]) dfs(v);
    if (vis[v]) low[u] = min(low[u], low[v]);
  }
  if (low[u] == idx[u]) {
    if (!gh[cmp]) gh[cmp] = u;
    gst[cmp] = st;
    while (1) {
      int v = s.back();
      s.pop_back();
      vis[v] = 0;
      gsz[cmp]++;
      gid[v] = cmp;
      if (v == u) break;
    }
  }
}
void dfs2(int u) {
  vis[u] = 1;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (!vis[v]) dfs2(v);
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int to;
    cin >> to;
    p[to] = i;
    g[i].push_back(to);
  }
  for (int i = 1; i <= n; i++) {
    if (!idx[i] && !p[i]) {
      cmp++;
      st = i;
      dfs(i);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!idx[i]) {
      cmp++;
      st = i;
      dfs(i);
    }
  }
  vector<pair<int, int>> ans;
  for (int i = 1; i <= cmp; i++) {
    if (gh[i] == gst[i % cmp + 1]) continue;
    ans.push_back({gh[i], gst[i % cmp + 1]});
  }
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++)
    cout << ans[i].first << ' ' << ans[i].second << endl;
}
