Niwango has N cards, numbered 1,2,\ldots,N. He will now arrange these cards in a row.

Niwango wants to know if there is a way to arrange the cards while satisfying all the N conditions below. To help him, determine whether such a way exists. If the answer is yes, also find the lexicographically smallest such arrangement.

* To the immediate right of Card 1 (if any) is NOT Card a_1.
* To the immediate right of Card 2 (if any) is NOT Card a_2.
* \vdots
* To the immediate right of Card N (if any) is NOT Card a_N.

Constraints

* 2 \leq N \leq 10^{5}
* 1 \leq a_i \leq N
* a_i \neq i

Input

Input is given from Standard Input in the following format:


N
a_1 a_2 \ldots a_N


Output

If no arrangements satisfy the conditions, print `-1`. If such arrangements exist, print the lexicographically smallest such arrangement, in the following format:


b_1 b_2 \ldots b_N


Here, b_i represents the i-th card from the left.

Examples

Input

4
2 3 4 1


Output

1 3 2 4


Input

2
2 1


Output

-1


Input

13
2 3 4 5 6 7 8 9 10 11 12 13 12


Output

1 3 2 4 6 5 7 9 8 10 12 11 13
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<complex>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<functional>
#include<assert.h>
#include<numeric>
using namespace std;
#define REP(i,m,n) for(int i=(int)(m) ; i < (int) (n) ; ++i )
#define rep(i,n) REP(i,0,n)
using ll = long long;
const int inf=1e9+7;
const ll longinf=1LL<<60 ;
const ll mod=1e9+7 ;

int main(){
    int n;
    cin>>n;
    int a[n];
    rep(i,n)cin>>a[i];
    rep(i,n)--a[i];
    if(n==2){
        cout<<-1<<endl;
        return 0;
    }
    map<int,int> mp;
    rep(i,n)mp[a[i]]++;
    set<int> st;
    rep(i,n)st.insert(i);
    int pre = -1;
    vector<int> b(n);
    rep(i,n-3){
        if(mp.size()==2){
            auto itr = mp.begin();
            if(itr->second==1)++itr;
            int nxt = itr->first;
            if(itr->second == n-i-1 && st.count(nxt)){
                b[i]=nxt;
                --mp[a[nxt]];
                if(mp[a[nxt]]==0)mp.erase(a[nxt]);
                pre = a[nxt];
                st.erase(nxt);
                continue;
            }
        }
        auto itr = st.begin();
        while(*itr==pre)++itr;
        int nxt = *itr;
        st.erase(itr);
        b[i]=nxt;
        pre = a[nxt];
        if(--mp[a[nxt]]==0)mp.erase(a[nxt]);
    }
    vector<int> x(3);
    auto itr = st.begin();
    rep(i,3){
        x[i]=*itr;
        ++itr;
    }
    do {
        bool ok = true;
        if(pre==x[0])ok=false;
        rep(i,2)if(a[x[i]]==x[i+1])ok=false;
        if(ok){
            rep(i,3)b[n-3+i]=x[i];
            break;
        }
    }while(next_permutation(x.begin(), x.end()));
    rep(i,n)cout<<b[i]+1<<" ";
    cout<<endl;
    return 0;
}