#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
void read(long long &x) {
  x = 0;
  char c = getchar();
  long long f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + c - '0';
    c = getchar();
  }
  x *= f;
  return;
}
void print(long long x) {
  if (x < 10) {
    putchar(x + '0');
    return;
  }
  print(x / 10);
  putchar(x % 10 + '0');
}
void write(long long x) {
  if (x < 0) x = -x, putchar('-');
  print(x);
}
long long maxt(long long a, long long b) { return a < b ? b : a; }
long long mint(long long a, long long b) { return a < b ? a : b; }
long long n;
long long nxt[1000005], rd[1000005], a[1000005], b[1000005], cnt;
long long vis[1000005];
long long dfs(long long x) {
  vis[x] = x;
  if (!vis[nxt[x]]) vis[x] = dfs(nxt[x]);
  return vis[x];
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) read(nxt[i]), rd[nxt[i]]++;
  for (int i = 1; i <= n; i++)
    if (!rd[i]) {
      a[cnt++] = i;
      b[cnt - 1] = dfs(i);
    }
  bool f = 0;
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      f = 1;
      a[cnt++] = i;
      b[cnt - 1] = dfs(i);
    }
  if (cnt == 1 && f) {
    puts("0");
    return 0;
  }
  write(cnt);
  putchar('\n');
  for (int i = 0; i < cnt; i++)
    write(b[i]), putchar(' '), write(a[(i + 1) % cnt]), putchar('\n');
  return 0;
}
