#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << ' ' << H;
  debug_out(T...);
}
const long long INF = 1e18;
const long long MOD = 1e9 + 7;
const int N = 1e5 + 5;
int H[N], HD[N], P[N], S[N], ST[N], FN[N], W[N], C[N], ts;
vector<int> G[N], Q[N];
pair<long long, int> SEG[N << 2];
long long LAZY[N << 2];
int DFSZ(int v) {
  S[v] = 1;
  for (int u : G[v])
    if (u != P[v]) H[u] = H[v] + 1, P[u] = v, S[v] += DFSZ(u);
  return S[v];
}
void DFSHLD(int v) {
  ST[v] = ts;
  for (int c : Q[v]) W[ts++] = c;
  int b = 0;
  for (int u : G[v])
    if (u != P[v] && S[u] > S[b]) b = u;
  if (b) HD[b] = HD[v], DFSHLD(b);
  for (int u : G[v])
    if (u != P[v] && u != b) HD[u] = u, DFSHLD(u);
  FN[v] = ts;
}
pair<long long, int> min(pair<long long, int> a, pair<long long, int> b) {
  if (a.first < b.first)
    return a;
  else if (a.first > b.first)
    return b;
  else if (C[W[a.second]] < C[W[b.second]])
    return a;
  return b;
}
void Apply(int id, long long x) {
  if (x == 0)
    SEG[id] = make_pair(INF, -1), LAZY[id] = 0;
  else
    SEG[id].first += x, LAZY[id] += x;
}
void Shift(int id) {
  if (LAZY[id] == 0) return;
  Apply(id << 1, LAZY[id]);
  Apply(id << 1 | 1, LAZY[id]);
  LAZY[id] = 0;
}
void Build(int id = 1, int s = 0, int e = ts) {
  if (e - s < 2) {
    SEG[id] = make_pair(W[s], s);
    return;
  }
  int md = (s + e) >> 1;
  Build(id << 1, s, md);
  Build(id << 1 | 1, md, e);
  SEG[id] = min(SEG[id << 1], SEG[id << 1 | 1]);
}
void Update(int l, int r, int x, int id = 1, int s = 0, int e = ts) {
  if (l >= e || s >= r) return;
  if (l <= s && e <= r) return Apply(id, x);
  Shift(id);
  int md = (s + e) >> 1;
  Update(l, r, x, id << 1, s, md);
  Update(l, r, x, id << 1 | 1, md, e);
  SEG[id] = min(SEG[id << 1], SEG[id << 1 | 1]);
}
pair<long long, int> Get(int l, int r, int id = 1, int s = 0, int e = ts) {
  if (l >= e || s >= r) return make_pair(INF, -1);
  if (l <= s && e <= r) return SEG[id];
  Shift(id);
  int md = (s + e) >> 1;
  return min(Get(l, r, id << 1, s, md), Get(l, r, id << 1 | 1, md, e));
}
pair<long long, int> GetMn(int v, int u) {
  pair<long long, int> res = make_pair(INF, -1);
  while (HD[v] != HD[u]) {
    if (H[HD[v]] < H[HD[u]]) swap(v, u);
    res = min(res, Get(ST[HD[v]], ST[v] + (int)(Q[v].size())));
    v = P[HD[v]];
  }
  if (H[v] < H[u]) swap(v, u);
  res = min(res, Get(ST[u], ST[v] + (int)(Q[v].size())));
  return res;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, m, q;
  cin >> n >> m >> q;
  for (int i = 1; i < n; i++) {
    int v, u;
    cin >> v >> u;
    G[v].push_back(u);
    G[u].push_back(v);
  }
  for (int i = 1; i <= m; i++) cin >> C[i], Q[C[i]].push_back(i);
  DFSZ(1);
  HD[1] = 1;
  DFSHLD(1);
  Build();
  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int v, u, k;
      cin >> v >> u >> k;
      vector<int> res;
      while (k--) {
        int x = GetMn(v, u).second;
        if (x == -1) break;
        res.push_back(W[x]);
        Update(x, x + 1, 0);
      }
      cout << (int)(res.size()) << ' ';
      for (int x : res) cout << x << ' ';
      cout << '\n';
    } else {
      int v, k;
      cin >> v >> k;
      Update(ST[v], FN[v], k);
    }
  }
  return 0;
}
