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 <iostream>
#include <vector>
#include <set>
#include <utility>
#include <algorithm>
#define llint long long

using namespace std;
typedef pair<llint, llint> P;

llint n;
llint p[100005], qcnt[100005];
set<P> S;
set<llint> T;
bool used[100005];

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

	cin >> n;
	for(int i = 1; i <= n; i++) cin >> p[i], qcnt[p[i]]++;
	if(n == 2){
		cout << -1 << endl;
		return 0;
	}

	for(llint i = 1; i <= n; i++) S.insert(P(qcnt[i], i)), T.insert(i);
	int v = 0;
	for(int i = 1; i <= n; i++){
		while(1){
			auto it = S.end(); it--;
			if(used[it->second]) S.erase(it);
			else break;
		}
		auto it = S.end(); it--;
		if(it->first == n-i){
			v = it->second;
			//cout << it->first << " " << it->second << endl;
			cout << v << " ";
			used[v] = true;
			T.erase(v);
			S.erase(P(qcnt[p[v]], p[v]));
			qcnt[p[v]]--;
			S.insert(P(qcnt[p[v]], p[v]));
			S.erase(it);
			continue;
		}
		for(auto it = T.begin(); it != T.end(); it++){
			if(*it == p[v]) continue;
			if(T.size() == 3){
				vector<llint> tmp;
				for(auto it2 = T.begin(); it2 != T.end(); it2++){
					if(*it != *it2) tmp.push_back(*it2);
				}
				if(p[tmp[0]] == tmp[1] && p[tmp[1]] == tmp[0]) continue;
			}
			v = *it;
			cout << v << " ";
			used[v] = true;
			T.erase(v);
			S.erase(P(qcnt[p[v]], p[v]));
			qcnt[p[v]]--;
			S.insert(P(qcnt[p[v]], p[v]));
			break;
		}
	}
	cout << endl;

	return 0;
}
