#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000 * 1000 + 10;
vector<int> topol, vec[MAXN];
int f[MAXN], cmp[MAXN], ver[MAXN], x[MAXN], en[MAXN];
bool mark[MAXN];
int cnt = 0;
void dfs(int v) {
  mark[v] = true;
  if (!mark[f[v]]) dfs(f[v]);
  topol.push_back(v);
}
void sfd(int v) {
  cmp[v] = cnt;
  ver[cnt] = v;
  x[cnt]++;
  mark[v] = true;
  for (auto u : vec[v])
    if (!mark[u]) sfd(u);
}
void dfs2(int sr, int v) {
  mark[v] = true;
  if (!mark[f[v]])
    dfs2(sr, f[v]);
  else
    en[sr] = f[v];
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  ;
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> f[i];
    f[i]--;
    vec[f[i]].push_back(i);
  }
  for (int i = 0; i < n; i++)
    if (!mark[i]) dfs(i);
  for (int i = 0; i < n; i++) mark[i] = false;
  for (int i = n - 1; i >= 0; i--)
    if (!mark[topol[i]]) {
      sfd(topol[i]);
      cnt++;
    }
  if (cnt == 1) {
    cout << 0 << endl;
    return 0;
  }
  vector<int> s;
  for (int i = 0; i < cnt; i++) {
    if (x[i] == 1 && (int)vec[ver[i]].size() == 0) s.push_back(ver[i]);
  }
  for (int i = 0; i < n; i++) mark[i] = false;
  for (auto i : s)
    if (!mark[i]) dfs2(i, i);
  for (int i = 0; i < cnt; i++)
    if (!mark[ver[i]]) {
      s.push_back(ver[i]);
      en[ver[i]] = ver[i];
    }
  vector<pair<int, int> > ans;
  for (int i = 0; i < (int)s.size(); i++) {
    ans.push_back({en[s[(i + 1) % (int)s.size()]] + 1, s[i] + 1});
  }
  cout << (int)ans.size() << endl;
  for (int i = 0; i < (int)ans.size(); i++)
    cout << ans[i].first << " " << ans[i].second << endl;
  return 0;
}
