#include<bits/stdc++.h>
#include<algorithm>
#define INF 1e9
#define LLINF 1e18
#define inf 0x3f3f3f3f
#define ll long long
#define FILE1(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define FILE2(x) freopen(x".in","r",stdin),freopen(x".ans","w",stdout)
#define FILE3(x) freopen(x".in","r",stdin)
#define Mod 998244353
using namespace std;
#define N 100005
int read(){
int x=0,f=1,ch=getchar();
for(;!isdigit(ch);ch=getchar()) f=(ch=='-')?-1:1;
for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
int add(int x,int y){return x+y>=Mod?x+y-Mod:x+y;}
int del(int x,int y){return add(x,Mod-y);}
int mul(int x,int y){return ((ll)x*y)%Mod;}
void Add(int &x,int y){x=add(x,y);}
void Del(int &x,int y){x=del(x,y);}
void Mul(int &x,int y){x=mul(x,y);}
int cid,T,n,m,q,head[N],tot,a[N],b[N],pre[N];
struct Edge{int to,nxt;}e[N<<1];
bitset<N>vis[N];
void add_edge(int x,int y){
e[++tot].to=y;
e[tot].nxt=head[x];
head[x]=tot;
}
namespace Subtask1{
void Main(){
n=read(),m=read(),q=read(),tot=0;
for(int i=1;i<=n;++i) head[i]=0;
for(int i=1;i<=m;++i){
int x=read(),y=read();
add_edge(x,y);
}
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=n;++i) b[i]=read();
for(int i=1;i<=n;++i) vis[i].reset();
for(int i=1;i<=n;++i) vis[i][i]=true;
for(int x=n;x>=1;--x){
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
vis[x]|=vis[y];
}
}
while(q--){
int op=read();
if(op==1){
int x=read(),y=read();
swap(a[x],a[y]);
}
else if(op==2){
int x=read(),y=read();
swap(b[x],b[y]);
}
else{
int x=read(),l=read(),r=read(),ans=0;
for(int i=1;i<=n;++i) if(vis[x][i] && l<=a[i] && a[i]<=r) ans=max(ans,b[i]);
printf("%d\n",ans);
}
}
}
}
void solve(){
Subtask1::Main();
}
int main(){
FILE1("recall");
cid=read(),T=read();
while(T--) solve();
return 0;
}