#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void *wmem;
char memarr[96000000];
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
  static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
  (*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
  (*arr)=(T*)(*mem);
  (*mem)=((*arr)+x);
}
inline void rd(int &x){
  int k;
  int m=0;
  x=0;
  for(;;){
    k = getchar_unlocked();
    if(k=='-'){
      m=1;
      break;
    }
    if('0'<=k&&k<='9'){
      x=k-'0';
      break;
    }
  }
  for(;;){
    k = getchar_unlocked();
    if(k<'0'||k>'9'){
      break;
    }
    x=x*10+k-'0';
  }
  if(m){
    x=-x;
  }
}
inline void wt_L(char a){
  putchar_unlocked(a);
}
inline void wt_L(int x){
  int s=0;
  int m=0;
  char f[10];
  if(x<0){
    m=1;
    x=-x;
  }
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  if(m){
    putchar_unlocked('-');
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
template<class T> inline T popFirst(multiset<T> &a){
  T res = *(a.begin());
  a.erase(a.begin());
  return res;
}
template<class T> inline T popFirst(set<T> &a){
  T res = *(a.begin());
  a.erase(a.begin());
  return res;
}
template <class T> struct LHeap{
  int *hp;
  int *place;
  int size;
  T *val;
  void malloc(int N){
    hp = (int*)std::malloc(N*sizeof(int));
    place=(int*)std::malloc(N*sizeof(int));
    val=(T*)std::malloc(N*sizeof(T));
  }
  void walloc(int N, void **mem=&wmem){
    walloc1d(&hp, N, mem);
    walloc1d(&place, N, mem);
    walloc1d(&val, N, mem);
  }
  void free(){
    std::free(hp);
    std::free(place);
    std::free(val);
  }
  void init(int N){
    int i;
    size=0;
    for(i=(0);i<(N);i++){
      place[i]=-1;
    }
  }
  void up(int n){
    int m;
    while(n){
      m=(n-1)/2;
      if(val[hp[m]]<=val[hp[n]]){
        break;
      }
      swap(hp[m],hp[n]);
      swap(place[hp[m]],place[hp[n]]);
      n=m;
    }
  }
  void down(int n){
    int m;
    for(;;){
      m=2*n+1;
      if(m>=size){
        break;
      }
      if(m+1<size&&val[hp[m]]>val[hp[m+1]]){
        m++;
      }
      if(val[hp[m]]>=val[hp[n]]){
        break;
      }
      swap(hp[m],hp[n]);
      swap(place[hp[m]],place[hp[n]]);
      n=m;
    }
  }
  void change(int n, T v){
    T f = val[n];
    val[n] = v;
    if(place[n]==-1){
      place[n] = size;
      hp[size++] = n;
      up(place[n]);
    }
    else{
      if(f < v){
        down(place[n]);
      }
      else if(f > v){
        up(place[n]);
      }
    }
  }
  int pop(void){
    int res = hp[0];
    place[res] = -1;
    size--;
    if(size){
      hp[0]=hp[size];
      place[hp[0]]=0;
      down(0);
    }
    return res;
  }
}
;
int N;
int A[100000];
LHeap<int> hp;
set<int> s;
int cnt[100000];
int res[100000];
int chk;
void solve(){
  int i;
  int j;
  int k;
  int n;
  set<int>::iterator it;
  if(N==2 && A[0]==1 && A[1]==0){
    wt_L(-1);
    wt_L('\n');
    return;
  }
  for(i=(0);i<(N);i++){
    cnt[i] = 0;
  }
  for(i=(0);i<(N);i++){
    cnt[i]++;
    cnt[A[i]]++;
  }
  hp.init(N);
  for(i=(0);i<(N);i++){
    hp.change(i, -cnt[i]);
  }
  s.clear();
  for(i=(0);i<(N);i++){
    s.insert(i);
  }
  for(i=(0);i<(N);i++){
    if(i>=N-3){
      res[i] = popFirst(s);
      continue;
    }
    k = hp.hp[0];
    if(cnt[k] == N-i){
      n = k;
    }
    else{
      it = s.begin();
      if(i && A[res[i-1]]==*it){
        it++;
      }
      n = *it;
    }
    res[i] = n;
    s.erase(n);
    cnt[n] = -1073709056;
    cnt[A[n]]--;
    hp.change(n, -cnt[n]);
    hp.change(A[n], -cnt[A[n]]);
  }
  for(;;){
    chk++;
    for(i=(1);i<(N);i++){
      if(res[i] == A[res[i-1]]){
        next_permutation(res,res+N);
        goto KrdatlYV;
      }
    }
    break;
    KrdatlYV:;
  }
  {
    int hCmBdyQB;
    if(N==0){
      putchar_unlocked('\n');
    }
    else{
      for(hCmBdyQB=(0);hCmBdyQB<(N-1);hCmBdyQB++){
        wt_L(res[hCmBdyQB]+ 1);
        wt_L(' ');
      }
      wt_L(res[hCmBdyQB]+ 1);
      wt_L('\n');
    }
  }
}
int main(){
  wmem = memarr;
  hp.walloc(100000);
  rd(N);
  {
    int YREPHmFM;
    for(YREPHmFM=(0);YREPHmFM<(N);YREPHmFM++){
      rd(A[YREPHmFM]);A[YREPHmFM] += (-1);
    }
  }
  solve();
  return 0;
}
// cLay varsion 20191229-1 [beta]

// --- original code ---
// int N, A[1d5];
// 
// LHeap<int> hp;
// set<int> s;
// int cnt[1d5];
// int res[1d5];
// int chk;
// 
// void solve(){
//   int i, j, k, n;
//   set<int>::iterator it;
// 
//   if(N==2 && A[0]==1 && A[1]==0) wt(-1), return;
// 
//   rep(i,N) cnt[i] = 0;
//   rep(i,N) cnt[i]++, cnt[A[i]]++;
// 
//   hp.init(N);
//   rep(i,N) hp.change(i, -cnt[i]);
//   s.clear();
//   rep(i,N) s.insert(i);
// 
//   rep(i,N){
//     if(i>=N-3){
//       res[i] = popFirst(s);
//       continue;
//     }
// 
//     k = hp.hp[0];
//     if(cnt[k] == N-i){
//       n = k;
//     } else {
//       it = s.begin();
//       if(i && A[res[i-1]]==*it) it++;
//       n = *it;
//     }
// 
//     res[i] = n;
//     s.erase(n);
//     cnt[n] = -int_inf; cnt[A[n]]--;
//     hp.change(n, -cnt[n]);
//     hp.change(A[n], -cnt[A[n]]);
//   }
// 
//   for(;;){
//     chk++;
//     rep(i,1,N) if(res[i] == A[res[i-1]]){
//       next_permutation(res,res+N);
//       break_continue;
//     }
//     break;
//   }
// 
//   wt(res(N) + 1);
// //  rep(i,1,N) assert(res[i] != A[res[i-1]]);
// //  rep(i,N) rep(j,i+1,N) assert(res[i] != res[j]);
// //  if(chk > 6) wt("chk", chk);
// //  assert(chk <= 6);
// }
// 
// {
//   hp.walloc(1d5);
//   rd(N,(A--)(N));
// 
// /*  for(;;){
//     N = rand()%10 + 2;
//     rep(i,N){
//       A[i] = rand()%N;
//       while(A[i]==i)A[i] = rand()%N;
//     }
//     wt("N", N);
//     wt("A", A(N)+1);
//     chk = 0;
//     solve();
//   }*/
// 
//   solve();
// }


Measured memory_bytes: 9600