#include <bits/stdc++.h>
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::istream;
using std::map;
using std::ostream;
using std::set;
using std::string;
using std::vector;
ostream &operator<<(ostream &os, const unsigned char v) {
  os << (int)v;
  return os;
}
istream &operator>>(istream &is, unsigned char &v) {
  int tmp;
  is >> tmp;
  v = (unsigned char)tmp;
  return is;
}
inline unsigned char min(unsigned char a, unsigned char b) {
  return (a < b) ? a : b;
}
inline unsigned char max(unsigned char a, unsigned char b) {
  return (a > b) ? a : b;
}
int pmod(int a, int b) {
  if (b < 0) {
    return pmod(-a, -b);
  }
  int ret = a % b;
  if (ret < 0) ret += b;
  return ret;
}
bool visited[100001];
int a[100001];
vector<int> cur;
vector<int> pre;
vector<std::pair<int, int> > edges;
int dfs(int u) {
  while (!visited[a[u]]) {
    cur.push_back(a[u]);
    visited[a[u]] = true;
    u = a[u];
  }
  if (!pre.empty()) {
    edges.push_back(std::pair<int, int>((pre.back()), (cur.front())));
  }
  pre.insert(pre.end(), cur.begin(), cur.end());
  cur.clear();
  return a[u];
}
int degree[100001 + 1];
int main(int argc, const char *argv[]) {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    degree[a[i]] += 1;
  }
  dfs(1);
  if (pre.size() == n) {
    printf("0\n");
  } else {
    memset(visited, false, sizeof(visited));
    cur.clear();
    pre.clear();
    int last = 0;
    for (int i = 1; i <= n; i++) {
      if (degree[i] == 0) {
        cur.push_back(i);
        visited[i] = true;
        last = dfs(i);
      }
    }
    for (int i = 1; i <= n; i++) {
      if (!visited[i]) {
        cur.push_back(i);
        visited[i] = true;
        last = dfs(i);
      }
    }
    if (last != pre.front()) {
      edges.push_back(std::pair<int, int>((last), (pre.front())));
    }
    cout << edges.size() << endl;
    for (int i = 0; i < edges.size(); i++) {
      printf("%d %d\n", edges[i].first, edges[i].second);
    }
  }
  return 0;
}
