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 <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i,a,b) for(ll i=(ll)(a);i<(ll)(b);i++)
#define rep(i,n) repl(i,0,n)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl
#define mmax(x,y) (x>y?x:y)
#define mmin(x,y) (x<y?x:y)
#define maxch(x,y) x=mmax(x,y)
#define minch(x,y) x=mmin(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt __builtin_popcountll

#define INF 1e16
#define mod 1000000007

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);

  ll N;
  cin>>N;
  vector<ll> A(N),cnt(N,0);
  rep(i,N){
  	cin>>A[i];
  	A[i]--;
    cnt[A[i]]++;
  }

  if(N==2){
  	cout<<"-1"<<endl;
  	return 0;
  }

  vector<bool> used(N,false);
  vector<ll> res(N);
  set<ll> st;
  rep(i,N){
    st.insert(i);
  }
  ll x=-1;
  rep(i,N-3){
    ll rest=N-i;
  	ll crt=-1;
  	ll Ax=-1;
  	if(x!=-1)Ax=A[x];

    ll mn=*st.begin();
    if(cnt[A[mn]]==rest-1&&!used[A[mn]]){
      crt=A[mn];
    }else{
      if(Ax==mn){
        auto it=st.begin();
        it++;
        crt=*it;
      }else{
        crt=mn;
      }
    }

  	used[crt]=true;
    st.erase(st.find(crt));
  	res[i]=crt;
  	x=crt;
    cnt[A[x]]--;
  }
  vector<ll> ps;
  rep(i,N){
  	if(used[i])continue;
  	ps.push_back(i);
  }
  do{
  	vector<ll> resb=res;
  	rep(i,3){
  		resb[N-3+i]=ps[i];
  	}
  	bool ok=true;
  	rep(i,N-1){
  		if(A[resb[i]]==resb[i+1])ok=false;
  	}
  	if(ok){
  		res=resb;
  		break;
  	}
  }while(next_permutation(all(ps)));

  rep(i,N)cout<<res[i]+1<<" ";
  cout<<endl;

  return 0;
}
