#include <bits/stdc++.h>
using namespace std;
long long modpow(long long a, long long b,
                 long long mod = (long long)(1e9 + 7)) {
  if (!b) return 1;
  a %= mod;
  return modpow(a * a % mod, b / 2, mod) * (b & 1 ? a : 1, mod) % mod;
}
const int maxn = 1e5;
int p = 0;
bool sink[maxn], source[maxn];
int nxt[maxn], x[maxn];
int vertex[maxn], cc[maxn];
void dfs1(int v, bool vis[]) {
  vis[v] = true;
  if (!vis[nxt[v]]) dfs1(nxt[v], vis);
  x[p++] = v;
}
void dfs2(int v, bool vis[], int c) {
  vis[v] = true;
  cc[v] = c;
  vertex[cc[v]] = v;
  if (!vis[nxt[v]])
    dfs2(nxt[v], vis, c);
  else if (cc[nxt[v]] != c)
    sink[c] = false, source[cc[nxt[v]]] = false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &nxt[i]), nxt[i]--;
  memset(sink, true, sizeof(sink));
  memset(source, true, sizeof(source));
  bool vis[n];
  memset(vis, false, sizeof(vis));
  int c = 0;
  for (int i = 0; i < n; i++)
    if (!vis[i]) dfs1(i, vis);
  memset(vis, false, sizeof(vis));
  for (int i = 0; i < n; i++)
    if (!vis[x[i]]) dfs2(x[i], vis, c++);
  vector<int> s;
  for (int k = 0; k < c; k++)
    if (source[k]) s.push_back(vertex[k]);
  if (s.size() == 1 && source[cc[s[0]]] && sink[cc[s[0]]]) {
    cout << 0 << endl;
    exit(0);
  }
  cout << s.size() << endl;
  for (int i = 0; i < s.size(); i++) {
    int k = s[i];
    while (!sink[cc[k]]) k = nxt[k];
    cout << k + 1 << " " << s[(i + 1) % s.size()] + 1 << endl;
  }
  return 0;
}
