#include <bits/stdc++.h>
using namespace std;
template <int Size>
struct UF {
  UF() {
    for (int i = 0; i < Size; i++) {
      rep[i] = i;
    }
  }
  int find(int a) {
    while (rep[a] != a) {
      a = rep[a] = rep[rep[a]];
    }
    return a;
  }
  int rep[Size];
  bool uni(int a, int b) {
    a = find(a);
    b = find(b);
    if (a == b) {
      return false;
    }
    rep[a] = b;
    return true;
  }
};
const int L = 1e5 + 2;
bool in[L];
vector<int> fs[L];
int main() {
  UF<L> uf;
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int d;
    scanf("%d", &d);
    uf.uni(i, d);
    in[d] = true;
  }
  vector<int> rs;
  for (int i = 1; i <= n; i++) {
    int a = uf.find(i);
    if (i == a) {
      rs.push_back(i);
    }
    if (!in[i]) {
      fs[a].push_back(i);
    }
  }
  vector<pair<int, int> > ret;
  for (int i = 0; i < rs.size(); i++) {
    int r = rs[i];
    int s = rs[(i + 1) % rs.size()];
    if (fs[r].size() == 0 && r != s) {
      ret.push_back(pair<int, int>(s, r));
    } else {
      for (auto p : fs[r]) {
        ret.push_back(pair<int, int>(s, p));
      }
    }
  }
  printf("%d\n", (int)ret.size());
  for (auto p : ret) {
    printf("%d %d\n", p.first, p.second);
  }
  return 0;
}
