#include<bits/stdc++.h>
using namespace std;
bool pan[2050][2050],dfs[5050];
vector<int>tu[200050];
int loc1[5050],loc2[5050],a[5050],b[5050];
void sou(int rt,int dang){
if(dfs[dang])return;
pan[rt][dang] = 1;
dfs[dang] = 1;
for(int i = 0;i < tu[dang].size();i++){
int u = tu[dang][i];
sou(rt,u);
}
}
void init(){
memset(pan,0,sizeof(pan));
memset(dfs,0,sizeof(dfs));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(loc1,0,sizeof(loc1));
memset(loc2,0,sizeof(loc2));
}
int main(){
freopen("recall.in","r",stdin);
freopen("recall.out","w",stdout);
int c,T;
scanf("%d%d",&c,&T);
if(c <= 5){
while(T--){
init();
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int i = 1;i <= m;i++){
int x,y;
scanf("%d%d",&x,&y);
tu[x].push_back(y);
}
for(int i = 1;i <= n;i++){
int x;
scanf("%d",&x);
loc1[x] = i;
a[i] = x;
}
for(int i = 1;i <= n;i++){
int x;
scanf("%d",&x);
loc2[x] = i;
b[i] = x;
}
for(int i = 1;i <= n;i++){
memset(dfs,0,sizeof(dfs));
sou(i,i);
}
for(int i = 1;i <= q;i++){
int o;
scanf("%d",&o);
if(o == 1){
int x,y;
scanf("%d%d",&x,&y);
swap(loc1[a[x]],loc1[a[y]]);
swap(a[x],a[y]);
}
else if(o == 2){
int x,y;
scanf("%d%d",&x,&y);
swap(loc2[b[x]],loc2[b[y]]);
swap(b[x],b[y]);
}
else{
int x,l,r;
scanf("%d%d%d",&x,&l,&r);
int ans = 0;
for(int j = l;j <= r;j++){
if(pan[x][loc1[j]] == 1){
ans = max(ans,b[loc1[j]]);
}
}
cout<<ans<<"\n";
}
}
for(int i = 1;i <= n;i++){
tu[i].clear();
}
}
}
return 0;
}