#include <bits/stdc++.h>   using namespace std;   const long long oo = 1e18;   const long long maxn = 2e5, maxm = 1e6, M = 20;   struct girl {     long long w, id;     bool operator<(const girl a) const { return w > a.w; }   };   pair<long long, long long> operator+(pair<long long, long long> a,                                        pair<long long, long long> b) {     return make_pair(a.first + b.first, a.second + b.second);   }   vector<girl> gf[maxn];   vector<int> g[maxn];   priority_queue<girl> Q[maxn];   pair<long long, long long> Min[maxm];   long long c[maxn], d[maxn], X[maxn][2], Y[maxn];   long long f[maxn][22];   long long nex[maxn], par[maxn], size[maxn], per[maxn];   long long Z[maxm], pos[maxm];   girl sta[maxn];   long long tot, L, R;   long long n, m, q, i, j, x, y, z, la;   void partition(long long o, long long fa) {     f[o][0] = fa;     size[o] = 1;     d[o] = d[fa] + 1;     long long len = g[o].size(), i;     for (i = 0; i < len; i++) {       long long v = g[o][i];       if (v == fa) continue;       partition(v, o);       size[o] += size[v];       if (size[v] > size[nex[o]]) nex[o] = v;     }   }   void dfs(long long o, long long fa) {     X[o][0] = ++tot;     Y[tot] = o;     if (nex[o]) dfs(nex[o], o);     long long len = g[o].size(), i;     for (i = 0; i < len; i++) {       long long v = g[o][i];       if (v == fa || v == nex[o]) continue;       dfs(v, o);     }     X[o][1] = tot;   }   void getPar(long long o, long long fa) {     if (nex[o]) getPar(nex[o], fa);     par[o] = fa;   }   void update(long long o) {     if (Min[2 * o] + make_pair(Z[2 * o], 0) <         Min[2 * o + 1] + make_pair(Z[2 * o + 1], 0)) {       Min[o] = Min[2 * o] + make_pair(Z[2 * o], 0);       pos[o] = pos[2 * o];     } else {       Min[o] = Min[2 * o + 1] + make_pair(Z[2 * o + 1], 0);       pos[o] = pos[2 * o + 1];     }   }   void pushdown(long long o) {     Z[2 * o] += Z[o];     Z[2 * o + 1] += Z[o];     Z[o] = 0;   }   void build(long long o, long long l, long long r) {     if (l + 1 == r) {       Q[l].push((girl){oo, 0});       long long len = gf[Y[l]].size(), i;       for (i = 0; i < len; i++) Q[l].push(gf[Y[l]][i]);       Min[o] = make_pair(Q[l].top().w, Y[l]);       pos[o] = l;       return;     }     long long m = (l + r) >> 1;     build(2 * o, l, m);     build(2 * o + 1, m, r);     update(o);   }   void change(long long o, long long l, long long r, long long x, long long y,               long long z) {     if (x <= l && r <= y) {       Z[o] += z;       return;     }     pushdown(o);     long long m = (l + r) >> 1;     if (x < m) change(2 * o, l, m, x, y, z);     if (m < y) change(2 * o + 1, m, r, x, y, z);     update(o);   }   void find(long long o, long long l, long long r, long long x, long long y,             pair<long long, long long> &MIN, long long &POS) {     if (x <= l && r <= y) {       if (Min[o] + make_pair(Z[o], 0) < MIN) {         MIN = Min[o] + make_pair(Z[o], 0);         POS = pos[o];       }       return;     }     pushdown(o);     long long m = (l + r) >> 1;     if (x < m) find(2 * o, l, m, x, y, MIN, POS);     if (m < y) find(2 * o + 1, m, r, x, y, MIN, POS);     update(o);   }   void take(long long o, long long l, long long r, long long v, girl &re) {     if (l + 1 == r) {       re = Q[l].top();       re.w += Z[o];       Q[l].pop();       Min[o] = make_pair(Q[l].top().w, Y[l]);       pos[o] = l;       return;     }     pushdown(o);     long long m = (l + r) >> 1;     if (v < m)       take(2 * o, l, m, v, re);     else       take(2 * o + 1, m, r, v, re);     update(o);   }   void insert(long long o, long long l, long long r, long long v, girl re) {     if (l + 1 == r) {       re.w -= Z[o];       Q[l].push(re);       Min[o] = make_pair(Q[l].top().w, Y[l]);       pos[o] = l;       return;     }     pushdown(o);     long long m = (l + r) >> 1;     if (v < m)       insert(2 * o, l, m, v, re);     else       insert(2 * o + 1, m, r, v, re);     update(o);   }   long long lca(long long x, long long y) {     if (d[x] < d[y]) swap(x, y);     long long i;     for (i = M; i >= 0; i--)       if (d[f[x][i]] >= d[y]) x = f[x][i];     if (x == y) return x;     for (i = M; i >= 0; i--)       if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];     return f[x][0];   }   girl find(long long u, long long v) {     long long a = lca(u, v);     pair<long long, long long> MIN = make_pair(oo, 0);     long long POS = 0;     for (long long i = 1; i <= 2; i++) {       while (d[u] >= d[a]) {         if (d[par[u]] >= d[a]) {           find(1, L, R, X[par[u]][0], X[u][0] + 1, MIN, POS);           u = f[par[u]][0];         } else {           find(1, L, R, X[a][0], X[u][0] + 1, MIN, POS);           u = f[a][0];         }       }       u = v;     }     girl re = (girl){oo, 0};     if (MIN == make_pair(oo, 0ll)) return re;     take(1, L, R, POS, re);     return re;   }   void solve(long long u, long long v, long long K) {     long long i, j;     for (i = 1; i <= K; i++) {       sta[i] = find(u, v);       if (sta[i].id == 0) break;     }     printf( %lld , i - 1);     for (j = 1; j < i; j++) printf(  %lld , sta[j].id);     printf(  n );   }   bool cmp(long long a, long long b) { return d[a] < d[b]; }   int main() {     scanf( %lld%lld%lld , &n, &m, &q);     for (i = 1; i < n; i++) {       scanf( %lld%lld , &x, &y);       g[x].push_back(y);       g[y].push_back(x);     }     for (i = 1; i <= m; i++) {       scanf( %lld , &x);       c[i] = x;       gf[x].push_back((girl){i, i});     }     partition(1, 0);     dfs(1, 0);     for (i = 1; i <= n; i++) per[i] = i;     sort(per + 1, per + n + 1, cmp);     for (i = 1; i <= n; i++)       if (!par[per[i]]) getPar(per[i], per[i]);     for (i = 1; i <= M; i++)       for (j = 1; j <= n; j++) f[j][i] = f[f[j][i - 1]][i - 1];     L = 1;     R = n + 1;     build(1, L, R);     for (long long qq = 1; qq <= q; qq++) {       scanf( %lld , &x);       if (x == 1) {         scanf( %lld%lld%lld , &x, &y, &z);         solve(x, y, z);       } else {         scanf( %lld%lld , &x, &y);         change(1, L, R, X[x][0], X[x][1] + 1, y);       }     }     return 0;   }