#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > data;
int pos[100005];
int ara[100005], vis[100005];
bool cmp(int a, int b) { return data[a].size() < data[b].size(); }
int main() {
  int n, i, j;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%d", &ara[i]);
  memset(vis, 0, sizeof(vis));
  for (i = 1; i <= n; i++) {
    if (vis[i]) continue;
    vector<int> temp;
    int now = i;
    while (!vis[now]) {
      vis[now] = 1;
      temp.push_back(now);
      now = ara[now];
    }
    data.push_back(temp);
  }
  for (i = 0; i < data.size(); i++) pos[i] = i;
  sort(pos, pos + data.size(), cmp);
  if (data.size() == 1) {
    if (data[0].size() > 2) {
      printf("NO\n");
      return 0;
    }
    if (data[0].size() == 1) {
      printf("YES\n");
      return 0;
    }
    printf("YES\n1 2\n");
    return 0;
  }
  if (data[pos[0]].size() > 2) {
    printf("NO\n");
    return 0;
  }
  if (data[pos[0]].size() == 1) {
    printf("YES\n");
    for (i = 0; i < data.size(); i++) {
      if (i == pos[0]) continue;
      for (j = 0; j < data[i].size(); j++)
        printf("%d %d\n", data[pos[0]][0], data[i][j]);
    }
    return 0;
  }
  for (i = 1; i < data.size(); i++) {
    if (data[pos[i]].size() % 2) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  for (i = 0; i < data.size(); i++) {
    if (i == pos[0]) continue;
    for (j = 0; j < data[i].size(); j++) {
      printf("%d ", data[i][j]);
      if (j % 2)
        printf("%d\n", data[pos[0]][1]);
      else
        printf("%d\n", data[pos[0]][0]);
    }
  }
  printf("%d %d\n", data[pos[0]][0], data[pos[0]][1]);
  return 0;
}
