#include <bits/stdc++.h>
using namespace std;
int n, m, q, pos[100005], num = 0, rig = 0, beg[100005];
int belong[100005], sz[100005], spe[100005], p[100005][18], h[100005];
int st[100005], en[100005], ans[100005], co[100005], en2[100005];
vector<int> g[100005], girl[100005];
struct interval {
  pair<long long, int> tree[100005 << 2];
  long long f[100005 << 2];
  void build(int l, int r, int id) {
    if (l == r) {
      tree[id] = make_pair(co[l], l);
      return;
    }
    int g = ((l + r) >> 1);
    build(l, g, id << 1);
    build(g + 1, r, (id << 1) + 1);
    tree[id] = min(tree[id << 1], tree[(id << 1) + 1]);
  }
  void push(int id) {
    tree[id << 1].first += f[id];
    tree[(id << 1) + 1].first += f[id];
    f[id << 1] += f[id];
    f[(id << 1) + 1] += f[id];
    f[id] = 0;
  }
  void update(int l, int r, int id, int x, int y, long long k) {
    if (l > y || r < x) return;
    if (x <= l && r <= y) {
      tree[id].first += k;
      f[id] += k;
      return;
    }
    int g = ((l + r) >> 1);
    push(id);
    update(l, g, id << 1, x, y, k);
    update(g + 1, r, (id << 1) + 1, x, y, k);
    tree[id] = min(tree[id << 1], tree[(id << 1) + 1]);
  }
  pair<long long, int> get(int l, int r, int id, int x, int y) {
    if (l > y || r < x)
      return make_pair(1ll * 100000007 * 100000007,
                       1ll * 100000007 * 100000007);
    if (x <= l && r <= y) return tree[id];
    int g = ((l + r) >> 1);
    push(id);
    pair<long long, int> a = get(l, g, id << 1, x, y);
    pair<long long, int> b = get(g + 1, r, (id << 1) + 1, x, y);
    return min(a, b);
  }
} t;
void dfs(int u) {
  sz[u] = 1;
  spe[u] = 0;
  for (int i = 0; i <= int(g[u].size()) - 1; i++) {
    int v = g[u][i];
    if (v == p[u][0]) continue;
    h[v] = h[u] + 1;
    p[v][0] = u;
    for (int i = 1; i <= 17; i++) p[v][i] = p[p[v][i - 1]][i - 1];
    dfs(v);
    sz[u] += sz[v];
    if (sz[v] > sz[spe[u]]) spe[u] = v;
  }
}
void hld(int u) {
  if (beg[num] == 0) beg[num] = u;
  belong[u] = num;
  st[u] = rig + 1;
  for (int i = 0; i <= int(girl[u].size()) - 1; i++) {
    int x = girl[u][i];
    pos[x] = ++rig;
    co[rig] = x;
  }
  en[u] = rig;
  if (spe[u]) {
    hld(spe[u]);
    for (int i = 0; i <= int(g[u].size()) - 1; i++) {
      int v = g[u][i];
      if (v == p[u][0] || v == spe[u]) continue;
      num++;
      hld(v);
    }
  }
  en2[u] = rig;
}
pair<long long, int> get(int a, int b) {
  pair<long long, int> re =
      make_pair(1ll * 100000007 * 100000007, 1ll * 100000007 * 100000007);
  while (belong[a] != belong[b]) {
    re = min(re, t.get(1, m, 1, st[beg[belong[a]]], en[a]));
    a = p[beg[belong[a]]][0];
  }
  re = min(re, t.get(1, m, 1, st[b], en[a]));
  return re;
}
int lca(int a, int b) {
  if (h[a] > h[b]) swap(a, b);
  int dif = h[b] - h[a];
  for (int i = 0; i <= 17; i++)
    if ((dif >> i) & 1) b = p[b][i];
  if (a == b) return a;
  for (int i = 17; i >= 0; i--)
    if (p[a][i] != p[b][i]) {
      a = p[a][i];
      b = p[b][i];
    }
  return p[a][0];
}
void setup() {
  cin >> n >> m >> q;
  int u, v;
  for (int i = 1; i <= n - 1; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= m; i++) {
    cin >> u;
    girl[u].push_back(i);
  }
}
void querry1() {
  int u, v, k;
  cin >> u >> v >> k;
  int l = lca(u, v);
  rig = 0;
  for (int i = 1; i <= k; i++) {
    pair<long long, int> best = min(get(u, l), get(v, l));
    if (best.first >= 1ll * 100000007 * 100000007) break;
    ans[++rig] = co[best.second];
    t.update(1, m, 1, best.second, best.second, 1ll * 100000007 * 100000007);
  }
  cout << rig << ' ';
  for (int i = 1; i <= rig; i++) cout << ans[i] << ' ';
  cout << '\n';
}
void querry2() {
  int v;
  long long k;
  cin >> v >> k;
  t.update(1, m, 1, st[v], en2[v], k);
}
void xuly() {
  dfs(1);
  hld(1);
  t.build(1, m, 1);
  int t;
  for (int i = 1; i <= q; i++) {
    cin >> t;
    if (t == 1)
      querry1();
    else
      querry2();
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  setup();
  xuly();
  return 0;
}
