#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <random>
#include <ctime>
#include <chrono>
#include <cassert>
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
namespace FastIO
{
const int MAXSIZE = 1 << 20;
char buf[MAXSIZE], *p1, *p2;
#define gc (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) ? EOF : *p1++)
template <typename T> void Read(T &x)
{
x = 0; char ch = gc; bool f = 0;
while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = gc; }
while (ch >= '0' && ch <= '9') x = x * 10 + (ch ^ 48), ch = gc;
if (f) x = -x;
}
}
using FastIO::Read;
using namespace std;
const int MAXN = 1e5 + 10, MAXM = 2e5 + 10;
const int B = 32;
int n, m, q;
pair <int, int> e[MAXM], re[MAXM];
int a[MAXN], b[MAXN];
int op[MAXN], l[MAXN], r[MAXN], x[MAXN];
int ans[MAXN];
int mv[MAXN], tmv, id[MAXN];
ull tomv[MAXN];
int tq, qid[MAXN], qrk[MAXN];
ull toqry[MAXN];
int blk[MAXN], tb;
ull tob[MAXN];
int idx[MAXN];
int main()
{
freopen("recall.in", "r", stdin);
freopen("recall.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
int cid, T;
Read(cid), Read(T);
while (T--)
{
Read(n), Read(m), Read(q);
for (int i = 1, u, v; i <= m; i++)
{
Read(u), Read(v);
e[i] = make_pair(u, v);
re[i] = make_pair(v, u);
}
sort(e + 1, e + m + 1), sort(re + 1, re + m + 1);
for (int i = 1; i <= n; i++) Read(a[i]);
for (int i = 1; i <= n; i++) Read(b[i]);
for (int i = 1; i <= q; i++)
{
Read(op[i]);
if (op[i] < 3) Read(l[i]), Read(r[i]);
else Read(x[i]), Read(l[i]), Read(r[i]);
ans[i] = 0;
}
for (int L = 1, R; L <= q; L = R + 1)
{
tmv = tq = 0;
memset(mv, -1, sizeof(mv));
memset(tomv, 0, sizeof(tomv));
memset(toqry, 0, sizeof(toqry));
memset(id, 0, sizeof(id));
memset(blk, 0, sizeof(blk));
R = L;
for (int i = L; i <= q && tmv < 62 && tq < 63; i++, R++)
if (op[i] < 3)
{
if (mv[l[i]] == -1) mv[l[i]] = tmv++;
if (mv[r[i]] == -1) mv[r[i]] = tmv++;
}
else toqry[x[i]] |= 1ull << tq, qid[i] = tq, qrk[tq] = i, tq++;
R--;
if (!tq)
{
for (int i = L; i <= R; i++)
if (op[i] == 1) swap(a[l[i]], a[r[i]]);
else swap(b[l[i]], b[r[i]]);
continue;
}
if (tmv)
{
for (int i = 1; i <= n; i++)
if (~mv[i]) tomv[i] ^= 1ull << mv[i], id[mv[i]] = i;
for (int i = m; i >= 1; i--)
tomv[e[i].first] |= tomv[e[i].second];
}
for (int i = 1; i <= m; i++)
toqry[re[i].first] |= toqry[re[i].second];
tb = 0;
for (int i = L; i <= R; i++)
if (op[i] == 3) blk[l[i]] = blk[r[i] + 1] = 1;
blk[1] = blk[n + 1] = 1;
for (int i = 1; i <= n + 1; i++)
if (blk[i]) blk[i] = ++tb;
else blk[i] = blk[i - 1];
for (int i = 1; i <= tb; i++) tob[i] = 0;
ull rem = 0;
for (int i = L; i <= R; i++)
if (op[i] == 3)
{
rem |= 1ull << qid[i];
for (int j = blk[l[i]]; j < blk[r[i] + 1]; j++)
tob[j] |= 1ull << qid[i];
}
for (int i = 1; i <= n; i++) toqry[i] &= tob[blk[a[i]]];
for (int i = 1; i <= n; i++) idx[b[i]] = i;
for (int i = n; i >= 1 && rem; i--)
{
int u = idx[i];
if (~mv[u]) continue;
ull cur = rem & toqry[u];
while (cur)
{
int v = __builtin_ctzll(cur);
ans[qrk[v]] = i, cur ^= 1ull << v, rem ^= 1ull << v;
}
}
for (int i = L; i <= R; i++)
{
if (op[i] == 1) swap(a[l[i]], a[r[i]]);
else if (op[i] == 2) swap(b[l[i]], b[r[i]]);
else
{
rem = tomv[x[i]];
while (rem)
{
int u = __builtin_ctzll(rem), v = id[u];
if (l[i] <= a[v] && a[v] <= r[i]) ans[i] = max(ans[i], b[v]);
rem ^= 1ull << u;
}
}
}
}
for (int i = 1; i <= q; i++)
if (op[i] == 3) cout << ans[i] << '\n';
}
return 0;
}