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")
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i=(a); i<(int)(b); i++)
#define FORD(i, a, b) for (int i=a; i>(int)(b); i--)
#define PPC(x) __builtin_popcount(x)
#define pb push_back
#define ALL(x) (x).begin(), (x).end()
#define ft first
#define sd second
#ifdef DEBUG
#include "debug.h"
#else
#define dbg(...) 0
#endif
using namespace std;

const int maxN = 1 << 17;

int T[maxN], res[maxN];
bool juz[maxN];

void fail()
{
	printf("-1\n");
	exit(0);
}

void ans(int n)
{
	FOR(i, 1, n+1)	
		printf("%d ", res[i]);
	printf("\n");
	exit(0);
}

bool colide(int i)
{	return T[res[i]] == res[i+1];	}

int main()
{
	int n;
	scanf ("%d", &n);
	FOR(i, 1, n+1)
		scanf ("%d", T+i);
	if (n == 2)
		fail();

	int list = 1, mx = 0;
		
	FOR(i, 0, n)
	{
		int v = res[i];
		if (T[v] != list)
			res[i+1] = list;
		else
			res[i+1] = mx == list-1 ? mx+2 : mx+1;
		juz[res[i+1]] = true;
		
		while (juz[list])
			list++;
		mx = max(mx, res[i+1]);
	}
	
	if (res[n] > n)
		res[n] = list;
	
	int i = n;
	while (colide(i-1))
		swap(res[i], res[i-1]), i--;
	sort(res+i+1, res+n+1);
	
	if (!colide(i))
		ans(n);
	if (i <= n-2)
		swap(res[i+1], res[i+2]), ans(n);
		
	assert(i == n-1);
	swap(res[n-2], res[n-1]);
	swap(res[n-2], res[n]);
	if (colide(n-3))
		swap(res[n-2], res[n]);
	ans(n);
	assert(false);
}
