#include <bits/stdc++.h>
using namespace std;

template<typename M>
struct segment_tree{
	typedef function<M(M, M)> F;
	int size;//2冪
	vector<M> val;//1-indexed
	F f;//結合関数
	M e;//単位元

	segment_tree(int N, vector<M> &data, F f, M e) : f(f), e(e){
		size = 1;
		while(size < N) size *= 2;
		val.assign(2 * size, e);
		for(int i = 0; i < N; i++) val[size + i] = data[i];
		for(int i = N; i < size; i++) val[size + i] = e;
		for(int i = size - 1; i > 0; i--) val[i] = f(val[2 * i], val[2 * i + 1]);
	}

	//k番目の要素をxに変更する
	void update(int k, M x){
		k += size;
		val[k] = x;
		while(k /= 2) val[k] = f(val[2 * k], val[2 * k + 1]);
	}

	//[l, r)の演算の結果を返す
	M query(int l, int r){
		M L = e, R = e;
		for(l += size, r += size; l < r; l /= 2, r /= 2){
			if(l & 1) L = f(L, val[l++]);
			if(r & 1) R = f(val[--r], R);
		}
		return f(L, R);
	}
};


//(int, my_max, -inf)
#define inf (int)(1e9)

int my_max(int x, int y){
	return max(x, y);
}

int main(){
	int N, i, j;
	scanf("%d", &N);
	vector<int> a(N + 1, -1);
	vector<int> data(N + 1, 0);
	for(i = 0; i < N; i++){
		scanf("%d", &a[i]);
		a[i]--;
		data[a[i]]++;
	}
/*	printf("a:\n");
	for(i = 0; i < N; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
*/	segment_tree<int> t(N, data, my_max, -inf);
	set<int> s;
	for(i = 0; i < N; i++){
		s.insert(i);
	}
	if(N <= 6){
		vector<int> perm(N);
		for(i = 0; i < N; i++){
			perm[i] = i;
		}
		do{
			int f = 1;
			for(i = 1; i < N; i++){
				if(a[perm[i - 1]] == perm[i]){
					f = 0;
				}
			}
			if(f == 1){
				for(i = 0; i < N; i++){
					printf("%d ", perm[i] + 1);
				}
				printf("\n");
				return 0;
			}
		}while(next_permutation(perm.begin(), perm.end()));
		printf("-1\n");
		return 0;
	}
	if(N == 2){
		printf("-1\n");
		return 0;
	}
	if(t.query(0, N) == N - 1){
		vector<int> ans2(0);
		for(i = 0; i < N; i++){
			if(t.query(i, i + 1) == N - 1){
				break;
			}
		}
		ans2.push_back(i);
		for(j = 0; j < N; j++){
			if(j != i && a[i] != j){
				break;
			}
		}
		ans2.push_back(j);
		for(int k = 0; k < N; k++){
			if(k != i && k != j){
				ans2.push_back(k);
			}
		}
		for(int k = 0; k < N; k++){
			printf("%d ", ans2[k] + 1);
		}
		printf("\n");
		return 0;
	}
	int last = N;
	vector<int> ans(0);
	while(s.size() > 6){
//		printf("last = %d\n", last);
		if(t.query(0, N) < s.size() - 1){
			for(int i : s){
				if(i != a[last]){
					ans.push_back(i);
					s.erase(i);
					j = a[last];
					t.update(j, t.query(j, j + 1) - 1);
					last = i;
					t.update(i, 0);
//					printf("test1:i = %d\n", i);
					break;
				}
			}
		}
		else if(t.query(0, N) == s.size() - 1){
			j = a[last];
			if(t.query(j, j + 1) == s.size() - 1){
				for(int i : s){
//					printf("i = %d\n", i);
//					printf("a[%d] = %d\n", i, a[i]);
//					printf("t.query(a[i], a[i] + 1) = %d\n", t.query(a[i], a[i] + 1));
					if(i != a[last] && t.query(a[i], a[i] + 1) < s.size() - 1){
						ans.push_back(i);
						s.erase(i);
						int j = a[last];
						t.update(j, t.query(j, j + 1) - 1);
						last = i;
						t.update(i, 0);
//						printf("test2:i = %d\n", i);
						break;
					}
				}
			}
			else{
				for(int i : s){
					if(i != a[last] && t.query(i, i + 1) == s.size() - 1){
						ans.push_back(i);
						s.erase(i);
						int j = a[last];
						t.update(j, t.query(j, j + 1) - 1);
						last = i;
						t.update(i, 0);
//						printf("test3:i = %d\n", i);
						break;
					}
				}
			}
		}
	}
	vector<int> sub(0);
	for(int i : s){
		sub.push_back(i);
	}
	do{
		int f = 1;
		if(a[last] == sub[0]){
			f = 0;
		}
		for(i = 1; i < sub.size(); i++){
			if(a[sub[i - 1]] == sub[i]){
				f = 0;
			}
		}
		if(f == 1){
			for(i = 0; i < sub.size(); i++){
				ans.push_back(sub[i]);
			}
			break;
		}
	}while(next_permutation(sub.begin(), sub.end()));
	for(i = 0; i < N; i++){
		printf("%d ", ans[i] + 1);
	}
	printf("\n");
	return 0;
}

Measured memory_bytes: 8832