//デバッグ用オプション：-fsanitize=undefined,address

//コンパイラ最適化
#pragma GCC optimize("Ofast")

//インクルードなど
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

//マクロ
//forループ
//引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
//FORAは範囲for文(使いにくかったら消す)
#define rep(i,n) for(ll i=0;i<ll(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=ll(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=ll(b);i--)
#define FORA(i,I) for(const auto& i:I)
//xにはvectorなどのコンテナ
#define ALL(x) x.begin(),x.end() 
#define SIZE(x) ll(x.size()) 
//定数
#define INF 1000000000000 //10^12:∞
#define MOD 1000000007 //10^9+7:合同式の法
#define MAXR 100000 //10^5:配列の最大のrange
//略記
#define PB push_back //挿入
#define MP make_pair //pairのコンストラクタ
#define F first //pairの一つ目の要素
#define S second //pairの二つ目の要素

/*
ビット全探索
for(int bit=0;bit<(1<<n);bit++){
        for(int i=0;i<n;i++){
            if(bit & (1<<i)){
            }
        }
*/

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

signed main(){
    //小数の桁数の出力指定
    //cout<<fixed<<setprecision(10);
    //入力の高速化用のコード
    //ios::sync_with_stdio(false);
    //cin.tie(nullptr);
    ll n,k;
    cin>>n>>k;
    map<int,int> a;
    rep(i,n){
        int A;
        cin>>A;
        a[A]++;
    }
    int count=k;
    int now=0;
    ll ans=0;
    for(auto itr=a.begin();itr!=a.end();itr++){
        if(now==itr->first){
            count=min(count,itr->second);
            ans+=count;
            now++;
        }
        else break;
    }
    cout<<ans<<endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
using vec_int = vector<int>;
using P = pair<int,int>;
using T = tuple<int,int,int>;
using ll = long long;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)

int charToInt(char c){
    char zero_num = '0';
    return (int)c - (int)zero_num;
}

signed main(){
    int N; cin>>N;
    vec_int a(N), b(N), p(N); 
    rep(i,N) cin>>a.at(i);
    rep(i,N) cin>>b.at(i);
    rep(i,N) cin>>p.at(i);

    vector<P> person(N);
    rep(i, N)person.at(i) = make_pair(a.at(i), i);
    sort(person.begin(), person.end());
    // 何をやらないといけないかというと、
    // 体重が軽い人の順番に
    // 自分のIDの荷物を持っている人と荷物を交換する
    // 

    map<int, int> assign_map;
    map<int, int> assign_map2;
    rep(i,N){
        assign_map[p.at(i)] = i; // 荷物, 人
        assign_map2[i] = p.at(i); //人, 荷物
    }

    int ans = 0;
    vector<P> ans_vec;
    for(int i=0;i<N;i++){
        int weight, person_ID; tie(weight, person_ID) = person.at(i); 
        //cout<<weight<<" "<<person_ID<<" "<<assign_map[person_ID]<<endl;
        if(person_ID == assign_map2[person_ID]-1){
            continue;
        }
        int nimotu = assign_map2[person_ID];
        if(weight <= b.at(nimotu-1) ){
            cout<<-1<<endl;
            return 0;
        }
        int counter_person = assign_map[person_ID+1]; // person_ID+1の荷物を持っている人
        assign_map2[person_ID] = person_ID+1; 
        assign_map2[counter_person] = nimotu;
        assign_map[nimotu] = counter_person;
        ans_vec.push_back(make_pair(person_ID+1, counter_person+1));
        ans++;
    }
    cout<<ans<<endl;
    rep(i, ans){
        cout<<ans_vec.at(i).first<<" "<<ans_vec.at(i).second<<endl;
    }


    return 0;
}