#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define visit asdf
const int N=2e5+5;

int n;
int a[N],b[N],c[N],p[N];
vector< vector<int> > v;
bool visit[N];

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	for(int i=1;i<=n;i++) scanf("%d",b+i);
	for(int i=1;i<=n;i++) scanf("%d",p+i);
	for(int i=1;i<=n;i++)
		if(a[i]<=b[p[i]] && p[i]!=i) return puts("-1"),0;
	for(int i=1;i<=n;i++) c[i]=b[p[i]];
	for(int i=1;i<=n;i++) b[i]=c[i];
	
	for(int i=1;i<=n;i++)
	{
		if(visit[i]) continue;
		vector<int> vec;
		vec.pb(i); visit[i]=1;
		int j=i;
		while(p[j]!=i)
		{
			vec.pb(p[j]);
			visit[p[j]]=1;
			j=p[j];
		}
		v.pb(vec);
	}
	printf("%d\n",n-v.size());
	for(int ii=0;ii<v.size();ii++)
	{
		vector<int> vec=v[ii];
		int mn=1e9,u;
		for(int i=0;i<vec.size();i++)
			mn=min(mn,b[vec[i]]);
		for(int i=0;i<vec.size();i++)
			if(b[vec[i]]==mn) u=i;
		for(int i=vec.size()+u;i>u+1;i--)
			printf("%d %d\n",vec[i%vec.size()],vec[(i-1)%vec.size()]);
	}
	
	return 0;
}
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 2e5 + 10 ;

int n ;
int a[MAX] , b[MAX] , p[MAX] , pos[MAX] ;

vector< pair<int , int> >vp , ans ;

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>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]-- ;
		pos[p[i]] = i ;
		if(b[p[i]] >= a[i] && p[i] != i)
			return cout<<-1<<"\n" , 0 ;
	}
	for(int i = 0 ; i < n ; ++i)
		vp.emplace_back(a[i] , i) ;
	sort(vp.begin() , vp.end()) ;
	for(auto &i : vp)
	{
		int idx = i.second ;
		if(p[idx] == idx)
			continue ;
		int x = pos[idx] ;
		ans.emplace_back(idx+1 , x+1) ;
		swap(p[idx] , p[x]) ;
		pos[idx] = idx , pos[p[x]] = x ;
	}
	cout<<ans.size()<<"\n" ;
	for(auto &i : ans)
		cout<<i.first<<" "<<i.second<<"\n" ;
	return 0 ;
}		