#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define LLL __int128
#define pii pair<int, int>
#define pil pair<int, LL>
#define fi first
#define se second
#define mkp make_pair
#define sz(x) (int)x.size()
#define ppc(x) __builtin_popcount(x)
#define pb push_back
using namespace std;
bool Med;
LL read() {
LL s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
f = (ch == '-' ? -1 : 1), ch = getchar();
while (ch >= '0' && ch <= '9')
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * f;
}
template<typename T> void chkmn(T &x, T y) {x = x > y ? y : x;}
template<typename T> void chkmx(T &x, T y) {x = x < y ? y : x;}
const int MAXN = 100005, B = 4000;
int n, m, q, a[MAXN], b[MAXN];
vector<int> e[MAXN];
int op[MAXN], x[MAXN], y[MAXN], ql[MAXN], qr[MAXN];
int tb[MAXN], in[MAXN], ans[MAXN], id[MAXN];
bitset<MAXN> to[MAXN];
namespace Blocker {
const int MAXC = 40;
int C, L[MAXN], R[MAXN], bl[MAXN];
int f[MAXC][MAXN];
void init() {
C = (n - 1) / B + 1;
for (int i = 1; i <= n; i++) bl[i] = (i - 1) / B + 1;
for (int i = 1; i <= n; i++) R[bl[i]] = i;
for (int i = n; i; i--) L[bl[i]] = i;
}
void work() {
for (int i = 1; i <= C; i++) {
for (int j = 1; j <= n; j++) f[i][j] = 0;
for (int j = L[i]; j <= R[i]; j++) f[i][id[j]] = tb[j];
for (int j = n; j; j--)
for (int k : e[j]) chkmx(f[i][j], f[i][k]);
}
}
int qry1(int x, int l, int r) {
int ans = 0;
for (int i = l; i <= r; i++)
if (to[x][id[i]]) chkmx(ans, tb[i]);
return ans;
}
int qry(int x, int l, int r) {
if (bl[l] == bl[r]) return qry1(x, l, r);
int ans = max(qry1(x, l, R[bl[l]]), qry1(x, L[bl[r]], r));
for (int i = bl[l] + 1; i < bl[r]; i++) chkmx(ans, f[i][x]);
return ans;
}
}
void work() {
n = read(), m = read(), q = read();
for (int i = 1; i <= n; i++) e[i].clear();
for (int i = 1; i <= m; i++) {
int u = read(), v = read();
e[u].pb(v);
}
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 <= q; i++) {
op[i] = read();
if (op[i] <= 2) x[i] = read(), y[i] = read();
else x[i] = read(), ql[i] = read(), qr[i] = read();
}
for (int i = 1; i <= n; i++) to[i].reset(), to[i][i] = 1;
for (int i = n; i; i--)
for (int j : e[i]) to[i] |= to[j];
Blocker::init();
for (int i = 1; i <= q; i += B) {
int l = i, r = min(q, i + B - 1);
for (int j = 1; j <= n; j++) in[j] = 0, tb[j] = 0, id[a[j]] = j;
for (int j = l; j <= r; j++)
if (op[j] <= 2) in[x[j]] = in[y[j]] = 1;
vector<int> p;
for (int j = 1; j <= n; j++)
if (!in[j]) tb[a[j]] = b[j];
else p.pb(j);
Blocker::work();
for (int j = l; j <= r; j++) {
if (op[j] == 1) swap(a[x[j]], a[y[j]]);
else if (op[j] == 2) swap(b[x[j]], b[y[j]]);
else {
ans[j] = Blocker::qry(x[j], ql[j], qr[j]);
for (int y : p)
if (to[x[j]][y] && ql[j] <= a[y] && a[y] <= qr[j]) chkmx(ans[j], b[y]);
}
}
}
for (int i = 1; i <= q; i++)
if (op[i] == 3) printf("%d\n", ans[i]);
}
bool Mst;
signed main() {
freopen("recall.in", "r", stdin);
freopen("recall.out", "w", stdout);
read(); int t = read();
while (t--) work();
cerr << 1.0 * clock() / CLOCKS_PER_SEC << endl;
return 0;
}