#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using uint = unsigned int;
#define rep(i,n) for(int i=0;i<int(n);i++)
#define rep1(i,n) for(int i=1;i<=int(n);i++)
#define per(i,n) for(int i=int(n)-1;i>=0;i--)
#define per1(i,n) for(int i=int(n);i>0;i--)
#define all(c) c.begin(),c.end()
#define si(x) int(x.size())
#define pb emplace_back
#define fs first
#define sc second
template<class T> using V = vector<T>;
template<class T> using VV = vector<vector<T>>;
template<class T,class U> void chmax(T& x, U y){if(x<y) x=y;}
template<class T,class U> void chmin(T& x, U y){if(y<x) x=y;}
template<class T> void mkuni(V<T>& v){sort(all(v));v.erase(unique(all(v)),v.end());}
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){
	return o<<"("<<p.fs<<","<<p.sc<<")";
}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){
	o<<"{";
	for(const T& v:vc) o<<v<<",";
	o<<"}";
	return o;
}
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n-1); }

#ifdef LOCAL
#define show(x) cerr << "LINE" << __LINE__ << " : " << #x << " = " << (x) << endl
void dmpr(ostream& os){os<<endl;}
template<class T,class... Args>
void dmpr(ostream&os,const T&t,const Args&... args){
	os<<t<<" ~ ";
	dmpr(os,args...);
}
#define shows(...) cerr << "LINE" << __LINE__ << " : ";dmpr(cerr,##__VA_ARGS__)
#define dump(x) cerr << "LINE" << __LINE__ << " : " << #x << " = {";  \
	for(auto v: x) cerr << v << ","; cerr << "}" << endl;
#else
#define show(x) void(0)
#define dump(x) void(0)
#define shows(...) void(0)
#endif

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);		//DON'T USE scanf/printf/puts !!
	cout << fixed << setprecision(20);

	int N,M; cin >> N >> M;
	if(N == 1 && M == 0){
		cout << 1 << " " << 2 << endl;
		return 0;
	}
	if(M < 0 || M == N || M == N-1){
		cout << -1 << endl;
		return 0;
	}
	rep(i,N-(M+1)){
		cout << i+1 << " " << i+1 + TEN(8) << endl;
	}
	rep(i,M+1){
		cout << TEN(7) + i*2 << " " << TEN(7) + i*2+1 << endl;
	}
}

#include <algorithm>
#include <array>
#include <cassert>
#include <chrono>
#include <cmath>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <vector>
using namespace std;



int main() {
    ios::sync_with_stdio(false);
    int N;
    cin >> N;
    vector<int64_t> A(N), B(N);
    vector<int> P(N), inv(N);

    for (auto &a : A)
        cin >> a;

    for (auto &b : B)
        cin >> b;

    for (auto &p : P) {
        cin >> p;
        p--;
    }

    for (int i = 0; i < N; i++)
        inv[P[i]] = i;

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

    vector<int> B_order(N);
    iota(B_order.begin(), B_order.end(), 0);
    sort(B_order.begin(), B_order.end(), [&](int x, int y) {
        return B[x] < B[y];
    });

    vector<array<int, 2>> ops;

    for (int b : B_order) {
        while (inv[b] != b) {
            int x = inv[b];
            int i = inv[x];
            ops.push_back({i, x});
            swap(inv[x], inv[b]);
            swap(P[i], P[x]);
        }
    }

    cout << ops.size() << '\n';

    for (auto &op : ops)
        cout << op[0] + 1 << ' ' << op[1] + 1 << '\n';
}
