#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+3;
const int M=2e5+3;
int C,T,n,m,Q,a[N],b[N],u[M],v[M];
int tot,head[N],ver[M],nex[M];
void add(int x,int y){
nex[++tot]=head[x];
ver[tot]=y;
head[x]=tot;
}bool vis[N];
int sta[N],stc,num,low[N],dfn[N],be[N];
vector<int>c[N];
void tarjan(int x){
dfn[x]=low[x]=++num;
sta[++stc]=x;vis[x]=1;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
int y;
while(y=sta[stc--]){
be[y]=x;
vis[y]=0;c[x].push_back(y);
if(x==y)break;
}
}
}
int tot1,head1[N],ver1[M],nex1[M];
void add1(int x,int y){
nex1[++tot1]=head1[x];
ver1[tot1]=y;
head1[x]=tot1;
}
vector<int>vi[N];bool vv[N];
void dfs(int x){
vv[x]=1;vi[x].push_back(x);
for(int i=head1[x];i;i=nex1[i]){
int y=ver1[i];
if(!vv[y])dfs(y);
for(int j=0;j<vi[y].size();++j)
vi[x].push_back(vi[y][j]);
}
}
bool you[N];
void pre(){
for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i);
for(int i=1;i<=m;++i){
int x=be[u[i]],y=be[v[i]];
if(x==y)continue;
add1(x,y);
}
for(int i=1;i<=n;++i)if(!vv[i])dfs(i);
for(int i=1;i<=n;++i)
if(vi[i].size()==1&&c[be[i]].size()>1){
you[be[i]]=1;
}
for(int i=1;i<=n;++i)
if(you[i])
for(int j=0;j<c[i].size();++j)
vi[i].push_back(c[i][j]);
for(int i=1;i<=n;++i){
int nnn=vi[i].size();
for(int j=0;j<nnn;++j){
if(i==vi[i][j])continue;
if(you[vi[i][j]]&&be[vi[i][j]]!=i){
for(int k=0;k<c[vi[i][j]].size();++k)
vi[i].push_back(c[vi[i][j]][k]);
}
}
}
for(int i=1;i<=n;++i){
if(i==be[i])continue;
if(you[be[i]]){
for(int j=0;j<vi[be[i]].size();++j){
vi[i].push_back(vi[be[i]][j]);
}
}
}
}
void cl(){
tot1=0,tot=0;stc=0;num=0;
for(int i=1;i<=n;++i)c[i].clear(),vi[i].clear();
memset(you,0,sizeof you);
memset(vv,0,sizeof vv);
memset(be,0,sizeof be);
memset(low,0,sizeof low);
memset(sta,0,sizeof sta);
memset(dfn,0,sizeof dfn);
memset(head,0,sizeof head);
memset(ver,0,sizeof ver);
memset(nex,0,sizeof nex);
memset(head1,0,sizeof head1);
memset(ver1,0,sizeof ver1);
memset(nex1,0,sizeof nex1);
}
void solve(){
cin>>n>>m>>Q;
for(int i=1;i<=m;++i){
cin>>u[i]>>v[i];
add(u[i],v[i]);
}
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=1;i<=n;++i)cin>>b[i];
pre();
int op,x,l,r;
while(Q--){
cin>>op;
if(op==1){
cin>>l>>r;
swap(a[l],a[r]);
}
if(op==2){
cin>>l>>r;
swap(b[l],b[r]);
}
if(op==3){
cin>>x>>l>>r;
int ans=0;
for(int i=0;i<vi[x].size();++i)
if(a[vi[x][i]]>=l&&a[vi[x][i]]<=r)
ans=max(ans,b[vi[x][i]]);
cout<<ans<<'\n';
}
}
cl();
}
signed main(){
freopen("recall.in","r",stdin);
freopen("recall.out","w",stdout);
cin>>C>>T;
while(T--)solve();
return 0;
}