Given are two sequences A and B, both of length N. A and B are each sorted in the ascending order. Check if it is possible to reorder the terms of B so that for each i (1 \leq i \leq N) A_i \neq B_i holds, and if it is possible, output any of the reorderings that achieve it.

Constraints

* 1\leq N \leq 2 \times 10^5
* 1\leq A_i,B_i \leq N
* A and B are each sorted in the ascending order.
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N
A_1 A_2 \cdots A_N
B_1 B_2 \cdots B_N


Output

If there exist no reorderings that satisfy the condition, print `No`.

If there exists a reordering that satisfies the condition, print `Yes` on the first line. After that, print a reordering of B on the second line, separating terms with a whitespace.

If there are multiple reorderings that satisfy the condition, you can print any of them.

Examples

Input

6
1 1 1 2 2 3
1 1 1 2 2 3


Output

Yes
2 2 3 1 1 1


Input

3
1 1 2
1 1 3


Output

No


Input

4
1 1 2 3
1 2 3 3


Output

Yes
3 3 1 2
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int64_t MOD=1000000007;
const long long INF = 1LL<<60;

void YN(bool x){
  if(x) cout<<"Yes"<<endl;
  else cout<<"No"<<endl;
}

int main() {
  bool finish=true;
  int N; cin>>N;
  vector<int> A(N),B(N),C(N,0),D(N,0);
  rep(i,N){
    cin>>A.at(i);
    C.at(A.at(i)-1)++;
  }
  rep(i,N){
    cin>>B.at(i);
    D.at(B.at(i)-1)++;
  }
  rep(i,N){
    if(C.at(i)+D.at(i)>N) finish=false;
  }
  YN(finish);
  if(finish){
    reverse(B.begin(),B.end());
    int k=0;
    rep(i,N){
      if(A.at(i)==B.at(i)){
        k=0;
        while(A.at(i)==B.at(k)||A.at(i)==A.at(k)){
          k++;
          if(k==N) k=0;
        }
        swap(B.at(i),B.at(k));
      }
    }
    rep(i,N){
      if(i==N-1) cout<<B.at(i)<<endl;
      else cout<<B.at(i)<<' ';
    }
  }        
}
