//g++ t.cpp -o t && t < p.txt
//d>p.txt&&t<p.txt&&t2<p.txt

#include <iostream> // プログラムの耳と口
#include <vector> // 超有能配列秘書
#include <algorithm> // みんな大好きソートと二分探索
#include <queue> // きゅーちゃん、だいすき
#include <string> // to_string
#include <functional> // 関数を変数に入れる子
#include <set> // 値の取得・挿入・削除を高速に
#include <map> // setの妹 これまた優秀
#include <random> // 乱択さん
#include <ctime>
#include <bitset>

#define DB cerr<<"D"<<endl
using namespace std; using ll=long long; using ld=long double; const int INF=1e9; const ll LINF=1e18; const double dINF = 1e18; const ld ldINF = 1e18; const double EPS = 1e-6;
template<typename T, typename U, typename O> void caut(T a, U b, O c){cout<<"("<<a<<","<<b<<","<<c<<") ";} template<typename T, typename U> void caut(T a, U b){cout<<"("<<a<<","<<b<<") ";} template<typename T> void caut(T a){cout<<"("<<a<<") ";};
using P=pair<ll,ll>;
const ll M = 1e9+7;
ll mod_pow(ll x, ll a) { ll an = 1; while(a > 0) { if (a&1) an = an * x % M; x = x * x % M; a >>= 1;} return an;}
void add(ll& x, ll y) {x+=y; x%=M;}; void mul(ll& x, ll y) {x*=y; x%=M;}; template<typename T, typename U> void chmax(T& x, U y) {if (x<y) x=y;}; template<typename T, typename U> void chmin(T& x, U y) {if (x>y) x=y;}
bool vaild(int x, int y, int hh, int ww){return 0<=x&&x<hh&&0<=y&&y<ww;}
int keta(ll a) {int res=0; while(a>0) res+=a%10, a/=10; return res;}
const int up[]={1,-1,0,0}, lf[]={0,0,1,-1};
ll gcd(ll a, ll b) {if (b==0) return a; else return gcd(b, a%b);}

int main() {
  int n; cin>>n;
  int a[n],b[n];
  for(int i=0;i<n;i++) {
    cin>>a[i]; a[i]--;
  }
  for(int i=0;i<n;i++) {
    cin>>b[i]; b[i]--;
  }

  int v[n]={}, u[n]={};
  for(int i=0;i<n;i++) {
    v[a[i]]++; v[b[i]]++; u[b[i]]++;
  }

  /*
  for(int i=0;i<n;i++) {
    cout<<a[i]<<" ";
  } cout<<endl;*/

  for(int i=0;i<n;i++) {
    if (v[i] > n) {
      cout<<"No"<<endl;
      return 0;
    }
  }

  fill(b,b+n,0);

  priority_queue<P> que;
  for(int i=0;i<n;i++) {
    if (v[i] > 0) que.push({v[i],i});
  }

  int ii = 0;
  while(ii < n) {
    //cout<<"u2 = "<<u[2]<<endl;
    P tp = que.top();
    while(v[tp.second] != tp.first || u[tp.second] == 0) que.pop(), tp = que.top();
    ll nw = tp.second;
    //cout << tp.first << " " << tp.second << " " << u[tp.second] << endl;
    if (a[ii] == nw) {
      if (que.empty()) {
        return 1;
      } else {
        que.pop();
        P tp2 = que.top();

        while(v[tp2.second] != tp2.first || u[tp2.second] == 0) que.pop(), tp2 = que.top();
        //cout << " " << tp2.first << " " << tp2.second<<endl;
        b[ii] = tp2.second;

        que.pop();
        que.push(tp);
        v[tp2.second]--; u[tp2.second]--;
        tp2.first--;
        if (tp2.first > 0) que.push(tp2);
      }
    } else {
      que.pop();
      b[ii] = tp.second;
      v[tp.second]--;
      tp.first--; u[tp.second]--;
      if (tp.first > 0) que.push(tp);
    }
    v[a[ii]]--;
    que.push({v[a[ii]], a[ii]});
    ii++;
    //cout << "u " << u[tp.second] << endl;
    /*
    for(int i=0;i<n;i++) {
      cout<<b[i]<<" ";
    } cout<<endl;*/

  }
  cout<<"Yes"<<endl;
  /*
  for(int i=0;i<n;i++) {
    cout<<a[i]+1<<" ";
  } cout<<endl;*/
  for(int i=0;i<n;i++) {
    cout<<b[i]+1<<" ";
  } cout<<endl;
}
// ・配列の大きさok？　・priority_queueはgreater？　・debug消した？
// ・落ち着いて。提出まで4分待ってね……WJ……1/10……2/10……

// Thank you for making problems and running the contest


Measured memory_bytes: 14708