#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define fast std::ios::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define test cout<<"archit\n"
#define debug(x) cout<<x<<" "
#define debug1(x) cout<<x<<"\n"
#define debug2(x,y) cout<<x<<" "<<y<<"\n"
#define pb push_back
#define pi pair<int,int>
#define fi first
#define si second
#define mod (ll)1000000007
#define mxn 1000005
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
int main()
{
    int n,x; cin>>n;
    vector<int>v(n);
    unordered_map<int, int>mp1;
    unordered_map<int, int>mp2;
    for(int i=1;i<=n;i++){
        cin>>v[i];
        mp1[v[i]]+=1;
    }
    for(int i=1;i<=n;i++){
        cin>>x;
        mp2[x]+=1;
    }
    sort(v.begin(), v.end());
    vector<int>ans;
    for(int i=0;i<n;i++){
        int mine = min(mp1[v[i]], mp2[v[i]]);
        for(int j=1;j<=mine;j++){
            ans.pb(v[i]);
        }
        mp1[v[i]] = 0;
    }
    for(int i=0;i<ans.size();i++){
        if(i!=(ans.size()-1)){
            cout<<ans[i]<<", ";
        }
        else{
            cout<<ans[i];
        }
    }
    return 0;
}
