// 解き直し.
// https://atcoder.jp/contests/arc111/editorial/519
// C++(GCC 9.2.1)
#include <bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
using PQ = priority_queue<P, vector<P>, greater<P>>;
using vPQ = vector<PQ>;
using vp = vector<P>;
#define repex(i, a, b, c) for(int i = a; i < b; i += c)
#define repx(i, a, b) repex(i, a, b, 1)
#define rep(i, n) repx(i, 0, n)
#define repr(i, a, b) for(int i = a; i >= b; i--)
#define pb push_back
#define a first
#define b second
int a[202020];  // 人 i の 体重.
int b[202020];  // 荷物 j の 重さ.
int ip[202020]; // 荷物 の index.
int ui[202020]; // 荷物 の index(更新用).
int op[202020]; // 人 i に置くべき荷物が, どこ(index)にあるか？

int main(){
    
    // 1. 入力情報.
    int N;
    scanf("%d", &N);
    rep(i, N) scanf("%d", &a[i]);
    rep(i, N) scanf("%d", &b[i]);
    rep(i, N){
        scanf("%d", &ip[i]);
        ip[i]--;
        ui[i] = ip[i];
        op[ip[i]] = i;
    }
    
    // 2. 特殊パターン(※すでに条件を満たしている場合).
    bool ok = true;
    rep(i, N){
        if(ip[i] != i){
            ok = false;
            break;
        }
    }
    if(ok){
        puts("0");
        return 0;
    }
    
    // 3. 初期状態チェック.
    ok = true;
    // rep(i, N) if(a[i] <= b[ip[i]]) ok = false;
    rep(i, N) if(ip[i] != i && a[i] <= b[ip[i]]) ok = false; // 1_026.txt対応.
    if(!ok){
        puts("-1");
        return 0;
    }
    
    // 4. サイクルを抽出.
    int cycle[N], cur;
    memset(cycle, 0, sizeof(cycle));
    vPQ C;
    rep(i, N){
        // 4-1. サイクル保存用.
        PQ c;
        
        // 4-2. 頂点 i から スタート.
        cur = i;
        
        // 4-3. サイクルをチェック.
        while(!cycle[cur]){
            // 4-4. 訪問済みフラグを立てる.
            cycle[cur] = 1;
            
            // 4-5. サイクルに頂点を保存.
            c.push({a[cur], cur}); // { 人 cur の 体重, 頂点 cur }.
            
            // 4-6. 現在頂点を更新し, 次の頂点へ.
            cur = ip[cur];
        }
        
        // 4-7. サイクルを追加.
        if(c.size()) C.pb(c);
    }
    // rep(i, C.size()){
    //     puts("----- start -----");
    //     PQ pq = C[i];
    //     while(!pq.empty()){
    //         int ta = pq.top().a, tb = pq.top().b;
    //         pq.pop();
    //         printf("a=%d b=%d\n", ta, tb);
    //     }
    //     puts("-----  end  -----");
    // }
    
    // 5. 各サイクル.
    // -> 軽い人から順番に確定させる.
    vp ans;
    int memo[N]; // 訪問済フラグ.
    memset(memo, 0, sizeof(memo));
    rep(i, C.size()){
        // 5-1. サイクル取得.
        PQ pq = C[i];
        
        // 5-2. サイクルの頂点をチェック.
        // -> 頂点数が, 1 に なったら終了.
        while(pq.size() > 1){
            // 5-3. 人 j を 取得.
            int j = pq.top().b;
            pq.pop();
            
            // 5-4. 人 j の 荷物(※人 l が 持つべきもの).
            int l = ui[j];
            
            // 5-5. 人 j の 荷物 を 確定.
            if(!memo[j]){
                // 訪問済みフラグ設定.
                memo[j] = 1;
                
                // 人 j の 荷物の場所(※人 k が 持っている).
                int k = op[j];
                
                // 人 j, k の 荷物 を 交換.
                swap(ui[j], ui[k]); // 人 j, k の 持っている荷物を交換.
                swap(op[j], op[l]); // 荷物の場所に対応する 人 の 番号 を 交換.
                
                // 操作情報を追加.
                ans.pb({j, k});
            }
        }
    }
    
    // 6. 出力.
    int al = ans.size();
    printf("%d\n", al);
    rep(i, al) printf("%d %d\n", ans[i].a + 1, ans[i].b + 1);
    return 0;
    
}
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using Graph = vector<vector<int>>;
using WGraph = vector<vector<pair<int, ll>>>;

template<class T>inline bool chmax(T &a, const T &b) { if (b > a) { a = b; return true; } return false; }
template<class T>inline bool chmin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; }

constexpr int INF = 1e9;
constexpr long long LINF = 1e18;
constexpr double EPS = 1e-10;
constexpr double PI = M_PI;

void solve() {
    int N;
    cin >> N;
    vector<int> a(N), b(N), p(N);
    for (int i=0; i<N; ++i) cin >> a[i];
    for (int i=0; i<N; ++i) cin >> b[i];
    for (int i=0; i<N; ++i) {
        cin >> p[i];
        --p[i];
    }

    for (int i=0; i<N; ++i) {
        if (p[i] != i && a[i] <= b[p[i]]) {
            cout << -1 << '\n';
            return;
        }
    }

    vector<int> rp(N);
    for (int i=0; i<N; ++i) rp[p[i]] = i;
    vector<pair<int, int>> ans;
    auto swp = [&p, &rp, &ans](int i, int j) {
        if (i == j) return;
        ans.emplace_back(i+1, j+1);
        swap(p[i], p[j]);
        rp[p[i]] = i;
        rp[p[j]] = j;
    };
    vector<int> ids(N);
    iota(ids.begin(), ids.end(), 0);
    sort(ids.begin(), ids.end(), [&b](int i, int j){return b[i] > b[j];});
    for (int idx : ids) {
        swp(idx, rp[idx]);
    }

    cout << (int)ans.size() << '\n';
    for (auto p : ans) cout << p.first << ' ' << p.second << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << fixed << setprecision(20);

    solve();

    return 0;
}
