/*
	Auth: StardustSphere
	Time: 2021/01/10
	Prog: ARC111-C
	Lang: cpp
*/
#define F_C
#include <bits/extc++.h>
#define rep(i, l, r) for(int i = l; i < r; i++)
#define hrp(i, l, r) for(int i = l; i <= r; i++)
#define rev(i, r, l) for(int i = r; i >= l; i--)
#define ms(n, t) memset(n, t, sizeof(n))
#define pb emplace_back
#define int ll
#ifndef JOEON
#define D(...) 97
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
template<typename tn = int> inline tn next(void) { tn k; cin>>k; return k; }
const int U = 2e5+50;
int afford[U], weight[U], keep[U], keeper[U];
vector<pii> ans;
vector<int> v;
signed main(void)
{
	#ifdef JOEON
//		freopen("C:\\Users\\Joeon\\Desktop\\IN.txt", "r", stdin);
//		freopen("C:\\Users\\Joeon\\Desktop\\OUT.txt", "w", stdout);
	#endif
	
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n = next();
	rep(i, 0, n) cin>>afford[i];
	rep(i, 0, n) cin>>weight[i];
	rep(i, 0, n)
	{
		keep[i] = next()-1;
		keeper[keep[i]] = i;
		if (afford[i] <= weight[keep[i]] && keep[i] != i) return cout<<-1<<endl, 0;
		if (keep[i] != i) v.pb(i);
	}

	sort(v.begin(), v.end(), [=](const int& a, const int& b)
	{
		return afford[a] < afford[b];
	});
	rep(i, 0, v.size()) // person
	{
		if (v[i] == keep[v[i]]) continue;
		int ot = keeper[v[i]];
		ans.pb(v[i], ot);
		swap(keep[v[i]], keep[ot]);
		keeper[keep[i]] = i;
		keeper[keep[ot]] = ot;
	}

	cout<<ans.size()<<endl;
	for(auto &[f, s] : ans) cout<<f+1<<' '<<s+1<<endl;

	return 0;
}
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef  long long int ll;
typedef long double db;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define pll pair<ll,ll>
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define ub(v,val) upper_bound(v.begin(),v.end(),val)
#define np(str) next_permutation(str.begin(),str.end())
#define lb(v,val) lower_bound(v.begin(),v.end(),val)
#define sortv(vec) sort(vec.begin(),vec.end())
#define rev(p) reverse(p.begin(),p.end());
#define v vector
#define pi 3.14159265358979323846264338327950288419716939937510
#define len length()
#define repc(i,s,e) for(ll i=s;i<e;i++)
#define fi first
#define se second
#define mset(a,val) memset(a,val,sizeof(a));
#define mt make_tuple
#define repr(i,n) for(i=n-1;i>=0;i--)
#define rep(i,n) for(i=0;i<n;i++)
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define at(s,pos) *(s.find_by_order(pos))
#define set_ind(s,val) s.order_of_key(val)
long long int M = 1e9 + 7 ;
long long int inf = 9 * 1e18;
//CLOCK
ll begtime = clock();
#define time() cout << "\n\nTime elapsed: " << (clock() - begtime)*1000/CLOCKS_PER_SEC << " ms\n\n";
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//CLOCK ENDED
ll n, m;
// modular exponentiation
ll binpow(ll val, ll deg)
{
	if (deg < 0)
		return 0;
	if (!deg)
		return 1 % M;
	if (deg & 1)
		return binpow(val, deg - 1) * val % M;
	ll res = binpow(val, deg >> 1);
	return (res * res) % M;
}
//binomial
ll modinv(ll n) {
	return binpow(n, M - 2);
}

int main() {
	// your code goes here
	IOS;
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	ll i, j, t, k, x, y, z,  N;
	cin >> n >> m >> k;
	map<ll, ll> fail;
	rep(i, k) {
		cin >> x;
		fail[x] = 1;
	}
	db dp_sum[n + m], dp_carry[n + m];
	rep(i, n + m) {
		dp_carry[i] = 0; dp_sum[i] = 0;
	}
	db sum = 0, car = 0;
	for (i = n - 1; i > 0; i--) {
		if (fail[i]) {
			dp_carry[i] = 1;
			dp_sum[i] = 0;

		}
		else {
			dp_carry[i] = car / db(m);
			dp_sum[i] = 1.0 + sum / db(m);
		}
		sum += dp_sum[i];
		car += dp_carry[i];
		sum -= dp_sum[i + m];
		car -= dp_carry[i + m];

	}
	sum = 1.0 + sum / db(m);
	car = car / db(m);
	// rep(i, n + m) {
	// 	cout << dp_sum[i] << ' ';
	// }
	db ans = sum / (1.0 - car);
	if (ans <= 0 || (1.0 - car) < 1e-6) cout << -1;
	else
		cout << fixed << setprecision(5) << ans;

	return 0;



}















