#include <bits/stdc++.h>
using namespace std;
const int N = 1000 * 100 + 10;
int n, comp;
int c[N], cs[N], r[N], f[N];
vector<int> v[N], rv[N], t, root, javab;
bool check[N];
void DFS(int x) {
  check[x] = true;
  for (int i = 0; i < (int)v[x].size(); i++)
    if (!check[v[x][i]]) DFS(v[x][i]);
  t.push_back(x);
}
void DFSR(int x) {
  check[x] = true;
  c[x] = comp;
  cs[x]++;
  r[comp] = x;
  for (int i = 0; i < (int)rv[x].size(); i++)
    if (!check[rv[x][i]]) DFSR(rv[x][i]);
}
void DFS2(int x) {
  check[x] = true;
  if (!check[f[x]])
    DFS2(f[x]);
  else
    javab.push_back(f[x]);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> f[i];
    f[i]--;
    v[i].push_back(f[i]);
    rv[f[i]].push_back(i);
  }
  for (int i = 0; i < n; i++)
    if (!check[i]) DFS(i);
  for (int i = 0; i < n; i++) check[i] = false;
  for (int i = n - 1; i >= 0; i--)
    if (!check[t[i]]) {
      DFSR(t[i]);
      comp++;
    }
  if (comp == 1) {
    cout << 0 << '\n';
    return 0;
  }
  for (int i = 0; i < n; i++) check[i] = false;
  for (int i = 0; i < comp; i++)
    if (cs[i] == 1 && (int)rv[r[i]].size() == 0) root.push_back(r[i]);
  for (int i = 0; i < (int)root.size(); i++) DFS2(root[i]);
  for (int i = 0; i < comp; i++)
    if (!check[r[i]]) {
      javab.push_back(r[i]);
      root.push_back(r[i]);
    }
  cout << (int)root.size() << '\n';
  for (int i = 0; i < (int)root.size(); i++)
    cout << javab[(i + 1) % (int)root.size()] + 1 << " " << root[i] + 1 << '\n';
  return 0;
}
