#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;
}
