#include <bits/stdc++.h>
using namespace std;
void cicleaza(const vector<int>& permut, vector<vector<int> >& cicluri) {
  const int n = permut.size();
  vector<bool> e_luat(n, false);
  for (int i = 0; i < n; ++i) {
    if (!e_luat[i]) {
      cicluri.push_back(vector<int>(0, 0));
      int j = i;
      do {
        e_luat[j] = true;
        cicluri.back().push_back(j);
        j = permut[j];
      } while (!e_luat[j]);
    }
  }
}
int main() {
  int n;
  cin >> n;
  vector<int> permut(n);
  for (auto& x : permut) {
    cin >> x;
    --x;
  }
  vector<vector<int> > cicluri;
  cicleaza(permut, cicluri);
  if (any_of(begin(cicluri), end(cicluri),
             [](const vector<int>& v) { return v.size() == 1; })) {
    cout << "YES\r\n";
    auto it = find_if(begin(cicluri), end(cicluri),
                      [](const vector<int>& v) { return v.size() == 1; });
    const int piv = it->front() + 1;
    cicluri.erase(it);
    for (int i = 1; i <= n; ++i) {
      if (piv != i) {
        cout << i << ' ' << piv << '\n';
      }
    }
  } else if (any_of(begin(cicluri), end(cicluri),
                    [](const vector<int>& v) { return v.size() == 2; }) &&
             all_of(begin(cicluri), end(cicluri),
                    [](const vector<int>& v) { return v.size() % 2 == 0; })) {
    cout << "YES\r\n";
    auto it = find_if(begin(cicluri), end(cicluri),
                      [](const vector<int>& v) { return v.size() == 2; });
    const vector<int> c = *it;
    cicluri.erase(it);
    cout << c[0] + 1 << ' ' << c[1] + 1 << "\r\n";
    for (const auto& x : cicluri) {
      for (int i = 0; i < x.size(); ++i) {
        cout << c[i % 2] + 1 << ' ' << x[i] + 1 << "\r\n";
      }
    }
  } else {
    cout << "NO\r\n";
  }
  return 0;
}
