#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5, inf = 1e18;
long long n, m, q, pter[N], be[N], en[N], ver[N], cur, sz[N], hchain[N],
    nchain = 1, inchain[N], par[N];
vector<long long> gr[N], s[N];
struct dtit {
  pair<long long, long long> node[N << 2];
  long long lz[N << 2], pl[N << 2];
  void build_tree(long long nd, long long left, long long right) {
    if (left > right) return;
    if (left == right) {
      node[nd] = pair<long long, long long>(s[ver[left]][0], ver[left]);
      return;
    }
    long long mid = left + right >> 1;
    build_tree(nd << 1, left, mid);
    build_tree(nd << 1 | 1, mid + 1, right);
    node[nd] = min(node[nd << 1], node[nd << 1 | 1]);
  }
  void true_val(long long nd, long long left, long long right) {
    if (left > right || !lz[nd]) return;
    node[nd].first += lz[nd];
    pl[nd] += lz[nd];
    if (left != right) {
      lz[nd << 1] += lz[nd];
      lz[nd << 1 | 1] += lz[nd];
    }
    lz[nd] = 0;
  }
  void update(long long nd, long long left, long long right, long long l,
              long long r, long long val, bool type) {
    true_val(nd, left, right);
    if (left > right || right < l || r < left) return;
    if (l <= left && right <= r) {
      if (type) {
        pter[node[nd].second]++;
        node[nd] = pair<long long, long long>(
            s[node[nd].second][pter[node[nd].second]] + pl[nd],
            node[nd].second);
      } else {
        lz[nd] = val;
        true_val(nd, left, right);
      }
      return;
    }
    long long mid = left + right >> 1;
    update(nd << 1, left, mid, l, r, val, type);
    update(nd << 1 | 1, mid + 1, right, l, r, val, type);
    node[nd] = min(node[nd << 1], node[nd << 1 | 1]);
  }
  pair<long long, long long> get(long long nd, long long left, long long right,
                                 long long l, long long r) {
    true_val(nd, left, right);
    if (left > right || right < l || r < left)
      return pair<long long, long long>(inf, 0);
    if (l <= left && right <= r) return node[nd];
    long long mid = left + right >> 1;
    return min(get(nd << 1, left, mid, l, r),
               get(nd << 1 | 1, mid + 1, right, l, r));
  }
} it;
void dfs(long long u, long long p) {
  par[u] = p;
  sz[u] = 1;
  for (long long v : gr[u])
    if (v != p) {
      dfs(v, u);
      sz[u] += sz[v];
    }
}
void hld(long long u, long long p) {
  if (!hchain[nchain]) hchain[nchain] = u;
  inchain[u] = nchain;
  be[u] = ++cur;
  ver[cur] = u;
  long long bigChild = 0;
  for (long long v : gr[u])
    if (v != p) {
      if (sz[v] > sz[bigChild]) bigChild = v;
    }
  if (bigChild) hld(bigChild, u);
  for (long long v : gr[u])
    if (v != p && v != bigChild) nchain++, hld(v, u);
  en[u] = cur;
}
pair<long long, long long> gethld(long long u, long long v) {
  pair<long long, long long> ret = pair<long long, long long>(inf, 0);
  while (inchain[u] != inchain[v]) {
    if (inchain[u] < inchain[v]) swap(u, v);
    long long pa = hchain[inchain[u]];
    ret = min(ret, it.get(1, 1, n, be[pa], be[u]));
    u = par[pa];
  }
  if (be[u] > be[v]) swap(u, v);
  ret = min(ret, it.get(1, 1, n, be[u], be[v]));
  return ret;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> q;
  for (long long i = 1; i < n; ++i) {
    long long u, v;
    cin >> u >> v;
    gr[u].push_back(v);
    gr[v].push_back(u);
  }
  for (long long i = 1; i <= m; ++i) {
    long long c;
    cin >> c;
    s[c].push_back(i);
  }
  for (long long i = 1; i <= n; ++i) s[i].push_back(inf);
  dfs(1, 1);
  hld(1, 1);
  it.build_tree(1, 1, n);
  while (q--) {
    long long type, u;
    cin >> type >> u;
    if (type == 2) {
      long long K;
      cin >> K;
      it.update(1, 1, n, be[u], en[u], K, 0);
    } else {
      long long v, K;
      cin >> v >> K;
      vector<long long> ans;
      ans.clear();
      while (K--) {
        pair<long long, long long> res = gethld(u, v);
        if (res.first == inf) break;
        ans.push_back(s[res.second][pter[res.second]]);
        it.update(1, 1, n, be[res.second], be[res.second], 0, 1);
      }
      cout << ans.size() << ' ';
      for (long long i : ans) cout << i << ' ';
      cout << '\n';
    }
  }
  return 0;
}
