#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector< vector<int> > T;
vector<int> C;
vector<int> ans;
vector<int> color_check;

void dfs(int now, int p){
    if(color_check[ C[now] ] == 0){
        ans.emplace_back(now);
    }

     color_check[ C[now] ]++;

    for(int i = 0; i < T[now].size(); i++){
        if(T[now][i] == p){
            continue;
        }else{
            dfs(T[now][i],now);
        }
    }
    color_check[ C[now] ]--;
    return;
}

int main(){

    //N頂点n-1辺の木の作成(木という名の無向グラフ)
    //頂点Aから頂点Bへの辺には頂点Aと頂点Bの色の情報も入れる。
    int N = 0;
    cin >> N;
    C.resize(N, 0);
    for(int i = 0; i < C.size(); i++){
        cin >> C[i];
    }
    T.resize(N);
    for(int i = 0; i < N-1; i++){
        int A = 0, B = 0;
        cin >> A >> B;
        T[A-1].emplace_back(B-1);
        T[B-1].emplace_back(A-1);
    }

    //深さ優先探索で探索
    //ちなみに頂点1は絶対によい頂点なので答えは1つ以上存在する。
    color_check.resize(100001, false);
    dfs(0,-1);

    sort(ans.begin(), ans.end());
    for(int i = 0; i < ans.size(); i++){
        cout << ans[i]+1 << endl;
    }

    return 0;
}
#include "bits/stdc++.h"

using namespace std;

const int maxn=2e5+5;
int a[maxn],b[maxn],p[maxn],ip[maxn];

void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    for(int i=1;i<=n;i++){
        cin>>p[i];
        ip[p[i]]=i;
    }
    priority_queue<pair<int,int>> pq;
    for(int i=1;i<=n;i++){
        pq.push(make_pair(b[i],i));
    }
    for(int i=1;i<=n;i++){
        if(a[i]<=b[p[i]] && p[i]!=i){
            cout<<"-1\n";
            return;
        }
    }
    vector<pair<int,int>> ops;
    for(int i=1;i<=n;i++){
        auto cur=pq.top();
        pq.pop();
        if(p[cur.second]==cur.second){
            continue;
        }
        int fst=cur.second,scnd=ip[cur.second];
        ops.emplace_back(fst,scnd);
        swap(ip[p[fst]],ip[p[scnd]]);
        swap(p[fst],p[scnd]);
    }
    cout<<(int)ops.size()<<'\n';
    for(auto i:ops){
        cout<<i.first<<' '<<i.second<<'\n';
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}