// That is not your swag, I swear you fake hard
#define Mo2 ios_base::sync_with_stdio(false) , cin.tie(NULL) , cout.tie(NULL);
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define tru ? cout<<"YES\n" : cout<<"NO\n"
#define int long long
const int N = 1e5+5 , OO = 0x3f3f3f3f3f3f3f3f , mod = 1e9+7;
// math problems are solved using math
// slow is smooth, smooth is fast
signed main() {
Mo2
// انتو اعدائي
int n,m,q,type,u,v,l,r; cin>>n>>m>>q;
vector <vector<int>> adj(n);
for(int i = 1 ; i < n ; ++i) {
cin>>u>>v;
--u; --v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int LOG = __lg(n) + 1;
vector <vector<int>> up(n,vector<int>(LOG));
vector <int> depth(n);
function <void(int,int)> dfs = [&] (int u,int p) {
up[u][0] = p;
for(int i = 1 ; i < LOG ; ++i) {
up[u][i] = up[up[u][i-1]][i-1];
}
for(int &v : adj[u]) if(v != p) {
depth[v] = depth[u] + 1;
dfs(v,u);
}
};
auto lca = [&] (int u, int v) {
if(depth[u] < depth[v]) swap(u,v);
int k = depth[u] - depth[v];
for(int i = 0 ; i < LOG ; ++i) if(k >> i & 1) u = up[u][i];
if(u == v) return u;
for(int i = LOG - 1 ; ~i ; --i) {
if(up[u][i] != up[v][i]) {
u=up[u][i];
v=up[v][i];
}
}
return up[u][0];
};
dfs(0,0);
vector <int> a(m);
for(int i = 0 ; i < m ; ++i) cin>>a[i],--a[i];
set <int> st[n],LC[n];
for(int i = 0 ; i < m ; ++i) st[a[i]].insert(i);
for(int i = 0 ; i + 1 < m ; ++i) {
LC[lca(a[i],a[i+1])].insert(i);
}
while(q--) {
cin>>type;
if(type==1) {
cin>>l>>u;
--l; --u;
int cur = a[l];
st[cur].erase(l);
st[u].insert(l);
if(m == 1) {
a[l] = u;
continue;
}
if(!l) {
int lc = lca(a[0],a[1]);
LC[lc].erase(0);
a[l] = u;
lc = lca(a[0],a[1]);
LC[lc].insert(0);
}
else if(l == m - 1) {
int lc = lca(a[m-1],a[m-2]);
LC[lc].erase(m-2);
a[l] = u;
lc = lca(a[m-1],a[m-2]);
LC[lc].insert(m-2);
}
else {
int lc1 = lca(a[l],a[l-1]) , lc2 = lca(a[l],a[l+1]);
LC[lc1].erase(l-1);
LC[lc2].erase(l);
a[l] = u;
lc1 = lca(a[l],a[l-1]) , lc2 = lca(a[l],a[l+1]);
LC[lc1].insert(l-1);
LC[lc2].insert(l);
}
}
else {
cin>>l>>r>>u;
--u;
--l; --r;
bool fail = true;
if(st[u].size()) {
auto it = st[u].lower_bound(l);
if(it != st[u].end() && *it <= r) {
cout<<*it+1<<' '<<*it+1<<endl;
fail = false;
}
}
if(fail) {
if(LC[u].size()) {
auto it = LC[u].lower_bound(l);
if(it != LC[u].end() && *it + 1 <= r) {
cout<<*it+1<<' '<<*it+2<<endl;
fail = false;
}
}
}
if(fail) cout<<-1<<' '<<-1<<endl;
}
}
return (0-0);
}