#include <bits/stdc++.h>   using namespace std;   const int N = 1e6 + 7;   int n, p[N];   deque<pair<int, int> > deq;   bool mrk[N];   vector<int> dor[2];   int dfs(int v, int d) {     mrk[v] = 1;     if (!mrk[p[v]]) return dfs(p[v], d + 1);     return d;   }   void add(int v, int l) {     dor[l].clear();     int pnt = v;     do {       dor[l].push_back(pnt);       pnt = p[pnt];     } while (pnt != v);   }   void remake(int l) {     int go = dor[l].size() / 2 + 1;     for (int i = 0; i < dor[l].size(); i++) {       p[dor[l][i]] = dor[l][(i + go) % dor[l].size()];     }   }   void merge() {     for (int i = 0; i < dor[0].size(); i++) {       p[dor[0][i]] = dor[1][i];       p[dor[1][i]] = dor[0][(1 + i) % dor[0].size()];     }   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> n;     for (int i = 1; i <= n; i++) cin >> p[i];     for (int i = 1; i <= n; i++) {       if (!mrk[i]) {         deq.push_back({dfs(i, 1), i});       }     }     sort(deq.begin(), deq.end());     while (deq.size()) {       if (deq[0].first % 2) {         add(deq[0].second, 0);         remake(0);         deq.pop_front();         continue;       }       if (deq.size() == 1 || deq[1].first != deq[0].first) {         cout << -1;         return 0;       }       add(deq[0].second, 0);       add(deq[1].second, 1);       merge();       deq.pop_front();       deq.pop_front();     }     for (int i = 1; i <= n; i++) cout << p[i] <<    ;     return 0;   }   