#include <bits/stdc++.h>
using namespace std;
void propagate(int node, const map<int, set<int> >& idToChildren,
               set<int>& leaves) {
  map<int, set<int> >::const_iterator it = idToChildren.find(node);
  if (it == idToChildren.end()) {
    leaves.insert(node);
    return;
  }
  const set<int>& s = (*it).second;
  for (set<int>::const_iterator cit = s.begin(); cit != s.end(); ++cit) {
    propagate(*cit, idToChildren, leaves);
  }
}
int main() {
  int n;
  cin >> n;
  int f[n + 1];
  char visited[n + 1];
  char inLoop[n + 1];
  int tag[n + 1];
  char hasParent[n + 1];
  char hasChild[n + 1];
  for (int i = 1; i <= n; i++) {
    cin >> f[i];
    visited[i] = inLoop[i] = 0;
    tag[i] = i;
    hasParent[i] = hasChild[i] = 0;
  }
  for (int i = 1; i <= n; i++) {
    if (visited[i]) continue;
    bool found = false;
    set<int> traversed;
    visited[i] = 1;
    traversed.insert(i);
    int x = i;
    int confluence = -1;
    while (1) {
      int xTemp = f[x];
      if (inLoop[xTemp]) {
        f[x] = tag[xTemp];
        break;
      } else if (traversed.find(xTemp) != traversed.end()) {
        found = true;
        confluence = xTemp;
        break;
      } else if (visited[xTemp]) {
        break;
      } else {
        x = xTemp;
        visited[x] = 1;
        traversed.insert(x);
      }
    }
    if (found) {
      int y = confluence;
      do {
        tag[y] = confluence;
        inLoop[y] = 1;
        y = f[y];
      } while (y != confluence);
    }
  }
  map<int, set<int> > idToChildren;
  map<int, set<int> > rootToLeaves;
  for (int i = 1; i <= n; i++) {
    if (inLoop[i]) continue;
    hasParent[i] = hasChild[f[i]] = 1;
    idToChildren[f[i]].insert(i);
  }
  set<int> roots;
  set<int> leaves;
  for (int i = 1; i <= n; i++) {
    if (tag[i] != i) continue;
    if (!hasParent[i]) {
      roots.insert(i);
    }
    if (!hasChild[i]) {
      leaves.insert(i);
    }
  }
  for (set<int>::const_iterator it = roots.begin(); it != roots.end(); ++it) {
    propagate(*it, idToChildren, rootToLeaves[*it]);
  }
  if (leaves.size() == 1 && *leaves.begin() == *roots.begin()) {
    cout << 0 << endl;
    return 0;
  }
  cout << leaves.size() << endl;
  int firstRoot = *roots.begin();
  int prevRoot = firstRoot;
  {
    set<int>::const_iterator it = roots.begin();
    advance(it, 1);
    for (; it != roots.end(); ++it) {
      for (set<int>::const_iterator lit = rootToLeaves[*it].begin();
           lit != rootToLeaves[*it].end(); ++lit) {
        cout << prevRoot << " " << *lit << endl;
      }
      prevRoot = *it;
    }
  }
  for (set<int>::const_iterator it = rootToLeaves[firstRoot].begin();
       it != rootToLeaves[firstRoot].end(); ++it) {
    cout << prevRoot << " " << *it << endl;
  }
  return 0;
}
