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;

#define MOD 1000000007
template<typename ty1,typename ty2>
inline int add(ty1 x, ty2 y) {
	if(y>=MOD)y%=MOD;
	if(x>=MOD)x%=MOD;
    x += y; return x < MOD ? x : x - MOD;
}
template<typename ty1,typename ty2>
inline void addto(ty1 &x, ty2 y) {
		  if(y>=MOD)y%=MOD;
		  if(x>=MOD)x%=MOD;
	      x += y; if (x >= MOD) x -= MOD;
}
template<typename ty1,typename ty2>
inline int sub(ty1 x, ty2 y) {
		if(y>=MOD)y%=MOD;
		 if(x>=MOD)x%=MOD;
        x -= y; return x < 0 ? x + MOD : x;
}
template<typename ty1,typename ty2>
inline void subto(ty1 &x, ty2 y) {
	if(y>=MOD)y%=MOD;
	if(x>=MOD)x%=MOD;
    x -= y; if (x < 0) x += MOD;
}
template<typename ty1,typename ty2>
inline int mul(ty1 x, ty2 y) {
        if(y>=MOD)y%=MOD;
		if(x>=MOD)x%=MOD;
        return 1ll * x * y % MOD;
}
template<typename ty1,typename ty2>
void multo(ty1 &x, ty2 y) {
        if(y>=MOD)y%=MOD;
		if(x>=MOD)x%=MOD;
        x=1ll * x * y % MOD;
}
#define MAX 100002

int n;
int rem;
int hated[MAX];
bool die[MAX];
int hate[MAX];
set<int> ava;
bool check(int node){
	if(die[hate[node]]==false&&hated[hate[node]]>=rem-1){
		return false;
	}
	if(rem-1>=3)return true;
	int a=*ava.begin();
	if(a==node)a=*ava.rbegin();
	int b=hate[a];
	int c=hate[b];
	int d=hate[c];
	if(rem==3&&die[c]==false&&die[d]==false&&c!=node&&d!=node&&c!=d&&hate[c]==d&&hate[d]==c){
		return false;
	}
	return true;
	//ng:
	//only 2-cycle
	//exist a_{v}, and everyone dislike a_{v}
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		int a;
		scanf("%d",&a);
		a--;
		hate[i]=a;
		hated[a]++;
	}
	if(n==2){
		puts("-1");
		return 0;
	}
	rem=n;
	set<int> ng;
	for(int i=0;i<n;i++)ava.insert(i);
	vector<int> ret;
	for(int i=0;i<n;i++){
		int id=-1;
		cerr<<i<<endl;
		for(auto el:ava){
			if(ng.count(el)==0&&check(el)){
				id=el;
				ng.clear();
				ng.insert(hate[el]);
				ava.erase(el);
				die[el]=true;
				rem--;
				hated[hate[el]]--;
				break;
			}
		}
		if(id==-1){
			puts("-1");
			return 0;
		}
		ret.push_back(id);
	}
	for(int i=0;i<n;i++){
		if(i)printf(" ");
		printf("%d",ret[i]+1);
	}
	puts("");
	return 0;
}
