#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<numeric>
#include<string>
#include<stack>
#include<queue>
#include<string.h>
#include<array>
#include<climits>
#include<algorithm>
#include<cmath>
using namespace std;
#define ff first
#define ss second
#define int long long
#define pb push_back
#define endl '\n'
const int maxn = 1e5 + 2;
const int Mx = 1e12;
const int oo = 1e18;
const int LG = 20;
int depth[maxn];
int up[maxn][LG];
vector<int> adj[maxn];
void dfs(int u, int p){
up[u][0] = p;
for(int i = 1; i < LG; i++){
up[u][i] = up[up[u][i - 1]][i - 1];
}
for(auto v : adj[u]){
if(v == p) continue;
depth[v] = depth[u] + 1;
dfs(v, u);
}
}
int lca(int u, int v){
if(depth[u] < depth[v]) swap(u, v);
int diff = depth[u] - depth[v];
for(int i = 0; i < LG; i++){
if(diff & (1 << i)){
u = up[u][i];
}
}
if(u == v) return u;
for(int i = LG - 1; i >= 0; i--){
if(up[u][i] != up[v][i]){
u = up[u][i];
v = up[v][i];
}
}
return up[u][0];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, k;
cin >> n >> m >> k;
for(int i = 0; i < n - 1; i++){
int a, b;
cin >> a >> b;
adj[a - 1].push_back(b - 1);
adj[b - 1].push_back(a - 1);
}
vector<int> a(m);
for(int i = 0; i < m; i++){
cin >> a[i];
a[i]--;
}
dfs(0, 0);
while(k--){
int t;
cin >> t;
if(t == 2){
int l, r, d;
cin >> l >> r >> d;
l--, r--, d--;
int ans = 0;
bool is = false;
for(int i = l; i <= r; i++){
int val = a[i];
for(int j = i; j <= r; j++){
val = lca(val, a[j]);
if(val == d){
cout << i + 1 << " " << j + 1 << endl;
is = true;
break;
}
}
if(is) break;
}
if(!is){
cout << "-1 -1" << endl;
}
}
else{
int pos, d;
cin >> pos >> d;
d--;
a[pos - 1] = d;
}
}
}