#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
#define all(x) (x).begin(), (x).end()
#define isz(x) (int)x.size()
#define int long long
const int block = 256, MAX = 2e5 + 100, mod = 1e9 + 7, LOG = 20, INF = 1e18;
int tin[MAX], tout[MAX], par[LOG][MAX], timer = 0;
array<int, 2> a[MAX];
vector<int> g[MAX];
void dfs(int u, int p) {
tin[u] = ++timer;
par[u][0] = p;
for (int d = 1; d < LOG; d++) {
par[u][d] = par[par[u][d - 1]][d - 1];
}
for (auto &v : g[u]) {
if (v == p) continue;
dfs(v, u);
}
tout[u] = timer;
}
bool is_anc(int u, int v) {
return tin[u] <= tin[v] && tin[v] <= tout[u];
}
int lca(int u, int v) {
if (is_anc(u, v)) return u;
if (is_anc(v, u)) return v;
for (int d = LOG - 1; d >= 0; d--) {
if (!is_anc(par[u][d], v)) {
u = par[u][d];
}
}
return par[u][0];
}
void run(int tc) {
int n, m, q; cin >> n >> m >> q;
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 1);
for (int i = 1; i <= m; i++) {
cin >> a[i][0];
a[i][1] = tin[a[i][0]];
}
while(q--) {
int ty; cin >> ty;
if (ty == 1) {
int p, x; cin >> p >> x;
a[p] = {x, tin[x]};
} else {
int l, r, v; cin >> l >> r >> v;
int last = -1, lc = -1;
array<int, 2> ans{-1, -1};
for (int i = l; i <= r; i++) {
auto [u, t] = a[i];
if (t > tout[v] || t < tin[v]) {
if (lc == v) {
ans = {last, i - 1};
break;
}
lc = -1;
} else {
if (lc != -1) lc = lca(lc, u);
else {
lc = u;
last = i;
}
if (lc == v) {
ans = {last, i};
break;
}
}
}
cout << ans[0] << ' ' << ans[1] << '\n';
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1; // cin >> t;
for (int tc = 1; tc <= t; tc++) run(tc);
}