#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
int n, COMP, god[N], d[N], comp[N], nxt[N];
bool mark[N];
vector<int> nei[N], rev_nei[N], comp_nei[N], vec;
vector<pair<int, int> > ans;
void dfs(int u) {
  mark[u] = true;
  for (int v : nei[u])
    if (mark[v] == false) dfs(v);
  vec.push_back(u);
}
void rev_dfs(int v, int c) {
  comp[v] = c;
  god[c] = v;
  for (int u : rev_nei[v])
    if (comp[u] == 0) rev_dfs(u, c);
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> nxt[i];
    rev_nei[--nxt[i]].push_back(i);
    nei[i].push_back(nxt[i]);
  }
  for (int i = 0; i < n; i++)
    if (mark[i] == false) dfs(i);
  reverse(vec.begin(), vec.end());
  for (int u : vec)
    if (comp[u] == 0) rev_dfs(u, ++COMP);
  if (COMP == 1) {
    cout << 0;
    return 0;
  }
  for (int v : vec)
    if (comp[nxt[v]] != comp[v]) comp_nei[comp[v]].push_back(comp[nxt[v]]);
  memset(mark, false, sizeof mark);
  vec.clear();
  for (int i = 1; i <= COMP; i++) nei[i] = comp_nei[i];
  for (int i = 1; i <= COMP; i++)
    if (mark[i] == false) dfs(i);
  reverse(vec.begin(), vec.end());
  for (int v : vec) cerr << v << ' ';
  cerr << "topo \n";
  memset(mark, false, sizeof mark);
  int last = -1;
  for (int v : vec)
    if (mark[v] == false) {
      if (last != -1) ans.push_back(pair<int, int>(god[last], god[v]));
      int u = v;
      while (mark[u] == false) {
        mark[u] = true;
        if (nei[u].size()) u = nei[u][0];
      }
      last = u;
    }
  ans.push_back(pair<int, int>(god[last], god[vec[0]]));
  cout << ans.size() << '\n';
  for (pair<int, int> p : ans)
    cout << p.first + 1 << ' ' << p.second + 1 << '\n';
  return 0;
}
