#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
#define endl '\n'
using namespace std;
void debug(){cout << "debug" << endl;}
void debug(string s){cout << "debug " << s << endl;}
void debug(int x){cout << "debug " << x << endl;}
int n,m,q,k;
vector<int>e[100010];
int dep[100010],siz[100010],fa[100010],son[100010];
multiset<int,greater<int> >st[40010];
void dfs1(int x,int f)
{
fa[x]=f,dep[x]=dep[f]+1,siz[x]++;
for ( int i = 0 ; i < e[x].size() ; i++ )
{
int v=e[x][i];
if(v==f)continue;
dfs1(v,x);
siz[x]+=siz[v];
if(siz[son[x]]<siz[v])son[x]=v;
}
}
int id[100010],bef[100010],top[100010],tot;
void dfs2(int x,int head)
{
if(!x)return;
id[x]=++tot,bef[tot]=x,top[x]=head;
dfs2(son[x],head);
for ( int i = 0 ; i < e[x].size() ; i++ )
{
int v=e[x][i];
if(v==fa[x]||v==son[x])continue;
dfs2(v,v);
}
}
struct node{
int a[25],tot;
int l,r;
}t[400010];
node pu(node l,node r)
{
node ans;
ans.l=l.l;
ans.r=r.r;
ans.tot=0;
int f1=0,f2=0;
while(f1<l.tot&&f2<r.tot&&ans.tot<k)
{
if(l.a[f1]>r.a[f2])
{
ans.a[ans.tot++]=l.a[f1++];
}else{
ans.a[ans.tot++]=r.a[f2++];
}
}
while(f1<l.tot&&ans.tot<k)
{
ans.a[ans.tot++]=l.a[f1++];
}
while(f2<r.tot&&ans.tot<k)
{
ans.a[ans.tot++]=r.a[f2++];
}
return ans;
}
#define iter multiset<int,greater<int> >::iterator
void build(int x,int l,int r)
{
t[x].l=l;
t[x].r=r;
if(l==r)
{
iter it=st[bef[l]].begin();
t[x].tot=0;
while(t[x].tot<k&&it!=st[bef[l]].end())
{
t[x].a[t[x].tot++]=*it;
it++;
}
return;
}
int mid=(l+r)/2;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
t[x]=pu(t[x<<1],t[x<<1|1]);
}
void upd(int x,int p)
{
int lf=t[x].l;
int rt=t[x].r;
if(p<lf||rt<p)
{
return;
}
if(p<=lf&&rt<=p)
{
iter it=st[bef[lf]].begin();
t[x].tot=0;
while(t[x].tot<k&&it!=st[bef[lf]].end())
{
t[x].a[t[x].tot++]=*it;
it++;
}
return;
}
upd(x<<1,p);
upd(x<<1|1,p);
t[x]=pu(t[x<<1],t[x<<1|1]);
}
node calc(int x,int l,int r)
{
int lf=t[x].l;
int rt=t[x].r;
if(l<=lf&&rt<=r)
{
return t[x];
}
int mid=(lf+rt)/2;
if(mid<l)
{
return calc(x<<1|1,l,r);
}
if(r<=mid)
{
return calc(x<<1,l,r);
}
return pu(calc(x<<1,l,r),calc(x<<1|1,l,r));
}
int x[40010],y[40010];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n ;
for ( int i = 1 ; i < n ; i++ )
{
int u,v;
cin >> u >> v;
e[u].push_back(v),e[v].push_back(u);
}
cin >> m;
for ( int i = 1 ; i <= m ; i++ )
{
cin >> x[i] >> y[i];
st[y[i]].insert(x[i]);
}
cin >> q>>k;
dfs1(1,1),dfs2(1,1),build(1,1,n);
while(q--)
{
int u,v,op;
cin >> op >> u >> v ;
if(op==1)
{
node ans;
ans.tot=0;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
{
swap(u,v);
}
ans=pu(ans,calc(1,id[top[u]],id[u]));
u=fa[top[u]];
}
ans=pu(ans,calc(1,min(id[u],id[v]),max(id[u],id[v])));
if(ans.tot==0)cout << -1;
for ( int i = 0 ; i < min(k,ans.tot) ; i++ )
{
cout << ans.a[i] << " ";
}
cout << endl;
}else if(op==2)
{
st[y[u]].erase(st[y[u]].find(x[u]));
st[v].insert(x[u]);
y[u]=v;
upd(1,id[y[u]]);
upd(1,id[v]);
}else{
st[y[u]].erase(st[y[u]].find(x[u]));
st[y[u]].insert(v);
upd(1,id[y[u]]);
x[u]=v;
}
}
return 0;
}