#include <bits/stdc++.h>
using namespace std;
size_t p3[80010];
namespace SegTree{
const int N=5e7+10;
int l[N],r[N],v[N],cnt=0;size_t h[N];
int ins(int x,int k,int p,int s,int t){
const int q=++cnt;
if(s<t){
const int mid=(s+t)>>1;
x<=mid?
(l[q]=ins(x,k,l[p],s,mid),r[q]=r[p]):
(l[q]=l[p],r[q]=ins(x,k,r[p],mid+1,t));
v[q]=max(v[l[q]],v[r[q]]);
h[q]=h[l[q]]*p3[t-mid]+h[r[q]];
}
else l[q]=r[q]=0,v[q]=k,h[q]=1;
return q;
}
int meld(int p,int q,int s,int t){
if(!p || !q)return p+q;
if(h[p]==h[q])return p;
const int mid=(s+t)>>1,ans=++cnt;
l[ans]=meld(l[p],l[q],s,mid);
r[ans]=meld(r[p],r[q],mid+1,t);
v[ans]=max(v[l[ans]],v[r[ans]]);
h[ans]=h[l[ans]]*p3[t-mid]+h[r[ans]];
return ans;
}
int ask(int ss,int tt,int p,int s,int t){
if(tt<s || ss>t || !p)return 0;
if(ss<=s && tt>=t)return v[p];
const int mid=(s+t)>>1;
return max(ask(ss,tt,l[p],s,mid),ask(ss,tt,r[p],mid+1,t));
}
void clear(){cnt=0;}
};
using SegTree::ins;
using SegTree::meld;
using SegTree::ask;
using SegTree::clear;
int a[80010],b[80010],c[80010],f[80010],n,m,q,s;
vector<int> e[80010];
bitset<80010> vis[80010];
inline void make(){
clear();
for(int i=n;i;i--){
f[i]=ins(a[i],b[i],0,1,n);
for(const int &j:e[i])
f[i]=meld(f[i],f[j],1,n);
}
}
int main(){
int num,t,o,x,y,l,r;
ios::sync_with_stdio(false);cin.tie(nullptr);
freopen("recall.in","r",stdin);
freopen("recall.out","w",stdout);
cin>>num>>t;
while(t--){
cin>>n>>m>>q;s=sqrt(n);p3[0]=1;
for(int i=1;i<=n;i++)p3[i]=p3[i-1]*3;
while(m--)cin>>x>>y,e[x].emplace_back(y);
for(int i=1;i<=n;i++)cin>>a[i],c[a[i]]=i;
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++){
sort(e[i].begin(),e[i].end());
e[i].erase(unique(e[i].begin(),e[i].end()),e[i].end());
}
for(int i=n;i;i--){
vis[i].reset();vis[i][i]=true;
for(const int &j:e[i])vis[i]|=vis[j];
}
set<int> bad;make();
while(q--){
cin>>o;
if(o==1){
cin>>x>>y;swap(a[x],a[y]);swap(c[a[x]],c[a[y]]);
bad.emplace(a[x]);bad.emplace(a[y]);
}
else if(o==2){
cin>>x>>y;swap(b[x],b[y]);
bad.emplace(a[x]);bad.emplace(a[y]);
}
else if(o==3){
cin>>x>>l>>r;
if(bad.size()>=s)make(),bad.clear();
int ans=0;auto p=bad.lower_bound(l);
for(int i=l;;p++){
const int nxt=(p!=bad.end()?min(*p-1,r):r);
if(i<=nxt)ans=max(ans,ask(i,nxt,f[x],1,n));
if(p!=bad.end() && *p<=r && vis[x][c[*p]])ans=max(ans,b[c[*p]]);
if(nxt==r)break;i=*p+1;
}
cout<<ans<<'\n';
}
}
for(int i=1;i<=n;i++)e[i].clear();
}
return 0;
}