//Just try and the idea will come!
#include<bits/stdc++.h>
using namespace std;
int n,m,q,i,x,y,z,timer,tin[200001],tout[200001],up[200001][19],l,r,a[200001];
vector<int>g[200001];
set<pair<int,int>>st[200001];
void dfs(int v,int p){
up[v][0]=p;
tin[v]=timer++;
for(int i=1;i<19;i++)up[v][i]=up[up[v][i-1]][i-1];
for(int to:g[v])if(to!=p)dfs(to,v);
tout[v]=timer++;
}
bool upper(int a,int b){
return tin[a]<=tin[b]&&tout[a]>=tout[b];
}
int lca(int a,int b){
if(upper(a,b))return a;
if(upper(b,a))return b;
for(int i=18;i>=0;i--)if(!upper(up[a][i],b))a=up[a][i];
return up[a][0];
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1,1);
scanf("%d",&x);
a[1]=x;
st[x].insert({1,1});
for(i=2;i<=m;i++){
scanf("%d",&y);
a[i]=y;
st[y].insert({i,i});
st[lca(y,x)].insert({i-1,i});
x=y;
}
while(q--){
scanf("%d",&x);
if(x&1){
scanf("%d%d",&x,&y);
st[a[x]].erase({x,x});
if(x>1)st[lca(a[x-1],a[x])].erase({x-1,x});
if(x<m)st[lca(a[x],a[x+1])].erase({x,x+1});
a[x]=y;
st[a[x]].insert({x,x});
if(x>1)st[lca(a[x-1],a[x])].insert({x-1,x});
if(x<m)st[lca(a[x],a[x+1])].insert({x,x+1});
}else{
scanf("%d%d%d",&x,&y,&z);
auto it=st[z].lower_bound({x,0});l=r=-1;
if(it!=st[z].end()&&it->second<=y){
l=it->first;
r=it->second;
}
printf("%d %d\n",l,r);
}
}
}