#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 20;
vector<int> comp[N], vt;
int col[N], a[N], bad[N], in[N], visited[N];
bool ok[N];
vector<pair<int, int>> ans;
inline void mer(int u, int v) {
  int c1 = col[u], c2 = col[v];
  if (c1 == c2) return;
  if ((int)comp[c1].size() > (int)comp[c2].size()) swap(c1, c2);
  for (int x : comp[c1]) {
    comp[c2].push_back(x);
    col[x] = c2;
  }
  comp[c1].clear();
  return;
}
void dfs(int u) {
  visited[u] = 1;
  int v = a[u];
  if (!visited[v])
    dfs(v);
  else {
    if (visited[v] == 1) bad[col[u]] = v;
  }
  visited[u] = 2;
  return;
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    col[i] = i;
    comp[i].push_back(i);
  }
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    a[i]--;
    in[a[i]]++;
    mer(i, a[i]);
  }
  for (int i = 0; i < n; i++) {
    if (!visited[i]) dfs(i);
  }
  int t1 = 0, t2 = 0;
  for (int i = 0; i < n; i++) {
    if (in[i] == 0) {
      vt.push_back(i);
      vt.push_back(bad[col[i]]);
      ok[col[i]] = true;
      t1++;
    }
  }
  for (int i = 0; i < n; i++) {
    if (!comp[i].empty() && !ok[i]) {
      t2++;
      for (int j = 0; j < 2; j++) vt.push_back(bad[i]);
    }
  }
  if (t1 == 0 && t2 == 1) {
    cout << 0;
    return 0;
  }
  for (int i = 1; i < (int)vt.size(); i += 2) {
    int j = (i + 1) % ((int)vt.size());
    ans.push_back({vt[i] + 1, vt[j] + 1});
  }
  cout << (int)ans.size() << '\n';
  for (auto [u, v] : ans) cout << u << " " << v << '\n';
  return 0;
}
