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 all(V) V.begin(),V.end()
#define ll long long
const ll MOD = 1000000007;

set<int> S;
int A[100010], B[100010], N, sa, sb, sc, sd;
vector<int> ss(3);

int dfs(int x) {
	if (x == N)return -1;
	//for (int i = 0;i <= N;i++)cout << B[i] << " ";cout << endl;
	auto it = S.begin();
	int y = *it, j;

	if (S.size() == 3) {
		sa = B[x];
		sb = *it;
		it++;
		sc = *it;
		it++;
		sd = *it;

		
		//ある要素Nの前に来れるような要素がない時
		//その要素Nとのつながりを否定しないような要素が現れるまで戻るべき
		
		ss = { sb,sc,sd };
		for (int i = 0;i < 6;i++) {
			if (A[sa] != ss[0] && A[ss[0]] != ss[1] && A[ss[1]] != ss[2]) {
				for (int j = 0;j < 3;j++)B[x + 1 + j] = ss[j];
				S = { -1,-2,-3,-4 };
				return -1;
			}
			next_permutation(all(ss));
		}
		S.insert(sa);
		return A[sa];
	}

	if (y == A[B[x]]) {
		S.erase(S.begin());

		B[x + 1] = *S.begin();
		S.erase(S.begin());
		S.insert(y);
	}
	else {
		S.erase(S.begin());
		B[x + 1] = y;
	}

	j = dfs(x + 1);
	if (j < 0)return j;
	S.insert(B[x + 1]);
	if (A[B[x]] == j) {
		return j;
	}
	else {
		B[x + 1] = j;
		S.erase(j);
		dfs(x + 1);
		return -1;
	}
}

int main() {
	cin >> N;
	for (int i = 1;i <= N;i++) {
		cin >> A[i];
		S.insert(i);
	}
	if (N == 2) {
		cout << -1 << endl;
		return 0;
	}
	int ans = dfs(0);
	
	for (int i = 1;i <= N;i++) {
		cout << B[i] << " ";
	}
	cout << endl;
}