#include<bits/stdc++.h>
#define ll long long
#define N 110000
using namespace std;
int c,T;
int n,m,q,a[N],b[N],ans;
struct ma{
int ver,nxt;
}edge[N*2];
int head[N],tot;
inline void add(int u,int v){
edge[++tot]={v,head[u]};
head[u]=tot;
}
bool vis[81000];
int opt,x,l,r;
void dfs(int u){
if(a[u]>=l&&a[u]<=r) ans=max(ans,b[u]);
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].ver;
if(vis[v]) continue;
vis[v]=1;
dfs(v);
}
}
void solve1(){
while(q--){
scanf("%d",&opt);
if(opt==1){
scanf("%d%d",&l,&r);
swap(a[l],a[r]);
}
else if(opt==2){
scanf("%d%d",&l,&r);
swap(b[l],b[r]);
}
else if(opt==3){
scanf("%d%d%d",&x,&l,&r);
memset(vis,0,sizeof(vis));
vis[x]=1;ans=0;
dfs(x);
printf("%d\n",ans);
}
}
}
int main()
{
freopen("recall.in","r",stdin);
freopen("recall.out","w",stdout);
scanf("%d%d",&c,&T);
while(T--){
tot=0;memset(head,0,sizeof(head));
scanf("%d%d%d",&n,&m,&q);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
solve1();
}
return 0;
}