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
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include <bits/stdc++.h>
using namespace std;
template<class t> inline t read(t &x){
	char c=getchar();bool f=0;x=0;
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	if(f) x=-x;return x;
}
template<class t,class ...A> inline void read(t &x,A &...a){
	read(x);read(a...);
}
template<class t> inline void write(t x){
	if(x<0) putchar('-'),write(-x);
	else{if(x>9) write(x/10);putchar('0'+x%10);}
}

#define x first
#define y second

const int N=1e5+5,C=5;
int n,a[N],ans[N];
set<int> rest;
map<int,int> du;

int check(){
	if(du.size()==2){
		for(auto i:du)if(i.y==rest.size()-1&&rest.count(i.x)) return i.x;
		return 0;
	}else{
		return 0;
	}
}

void dfs(int x,int last,set<int> rest){
	if(x>n){
		for(int i=1;i<=n;i++) write(ans[i]),putchar(' ');
		exit(0); 
	}
	for(auto i:rest) if(i!=last){
		ans[x]=i; set<int> tp=rest; tp.erase(i);
		dfs(x+1,a[i],tp);
	}
}

signed main(){
	read(n);
	for(int i=1;i<=n;i++) read(a[i]),rest.insert(i),du[a[i]]++; 
	if(n==2) return write(-1),0;
	int last=0; 
	for(int i=1;i<=n-C;i++){
		int t=check();
		if(t){
			ans[i]=t; 
		}else{
			auto it=rest.begin();
			if(*it==last)it++;
			ans[i]=*it;
		}
		if(--du[a[ans[i]]]==0)du.erase(a[ans[i]]);
		rest.erase(ans[i]);
		last=a[ans[i]];
	}
	dfs(max(1,n-C+1),last,rest);
	write(-1);
}