#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
const int MAXL = 16;
const int INF = 1e9;
struct Girl {
  long long val;
  int jnc, inv;
  Girl(long long _val = INF, int _jnc = -1, int _inv = 0) {
    val = _val;
    jnc = _jnc;
    inv = _inv;
  }
  bool operator<(const Girl& other) const {
    if (jnc == -1)
      return 0;
    else if (other.jnc == -1)
      return 1;
    if (val == other.val) return jnc < other.jnc;
    return val < other.val;
  }
  Girl operator-(const long long& _val) { return {val - _val, jnc}; }
};
struct Node {
  Girl minv;
  long long lazy;
  long long lazyv;
  Node() { lazy = lazyv = 0; }
} aint[4 * MAXN + 5];
vector<int> G[MAXN + 5];
vector<int> ft[MAXN + 5];
int rmq[MAXL + 5][MAXN + 5];
int sz[MAXN + 5], h[MAXN + 5];
int rep[MAXN + 5];
int hvo[MAXN + 5], first[MAXN + 5], last[MAXN + 5];
int sol[MAXN + 5];
int k;
void init(int node, int f) {
  h[node] = 1 + h[f];
  rmq[0][node] = f;
  for (int i = 1; i <= MAXL; ++i) rmq[i][node] = rmq[i - 1][rmq[i - 1][node]];
  sz[node] = 1;
  for (auto it : G[node])
    if (it != f) {
      init(it, node);
      sz[node] += sz[it];
    }
}
void hp(int node, int f, int pos) {
  pos++;
  int w = 0;
  for (auto it : G[node])
    if (it != f)
      if (sz[w] < sz[it]) w = it;
  if (pos == 1)
    rep[node] = node;
  else
    rep[node] = rep[f];
  hvo[++k] = node;
  first[node] = k;
  if (w) {
    hp(w, node, pos);
    for (auto it : G[node])
      if (it != f && it != w) hp(it, node, 0);
  }
  last[node] = k;
}
int lca(int a, int b) {
  if (h[a] < h[b]) swap(a, b);
  for (int i = MAXL; i >= 0; --i)
    if (h[a] - (1 << i) >= h[b]) a = rmq[i][a];
  for (int i = MAXL; i >= 0; --i)
    if (h[a] > (1 << i) && rmq[i][a] != rmq[i][b]) a = rmq[i][a], b = rmq[i][b];
  if (a != b) a = rmq[0][a];
  return a;
}
void build(int node, int l, int r) {
  if (l == r) {
    if (ft[hvo[l]].size() > 0) {
      aint[node].minv = {ft[hvo[l]].back(), hvo[l], ft[hvo[l]].back()};
      ft[hvo[l]].pop_back();
    }
    return;
  }
  int mid = (l + r) / 2;
  build(2 * node, l, mid);
  build(2 * node + 1, mid + 1, r);
  aint[node].minv = min(aint[2 * node].minv, aint[2 * node + 1].minv);
}
void propag(int node, int l, int r) {
  aint[node].lazyv += aint[node].lazy;
  if (l != r && aint[node].lazy) {
    aint[2 * node].lazy += aint[node].lazy;
    aint[2 * node].minv.val += aint[node].lazy;
    aint[2 * node + 1].lazy += aint[node].lazy;
    aint[2 * node + 1].minv.val += aint[node].lazy;
  }
  aint[node].lazy = 0;
}
void update1(int node, int l, int r, int a, int b, int vl) {
  propag(node, l, r);
  if (a <= l && r <= b) {
    aint[node].minv.val += vl;
    aint[node].lazy += vl;
    propag(node, l, r);
    return;
  }
  int mid = (l + r) / 2;
  if (a <= mid) update1(2 * node, l, mid, a, b, vl);
  if (b > mid) update1(2 * node + 1, mid + 1, r, a, b, vl);
  aint[node].minv = min(aint[2 * node].minv, aint[2 * node + 1].minv);
}
void update2(int node, int l, int r, int pos) {
  propag(node, l, r);
  if (l == r) {
    Girl nw;
    if (ft[hvo[l]].size() > 0) {
      nw = {ft[hvo[l]].back(), hvo[l], ft[hvo[l]].back()};
      ft[hvo[l]].pop_back();
    }
    nw.val += aint[node].lazyv;
    aint[node].minv = nw;
    return;
  }
  int mid = (l + r) / 2;
  if (pos <= mid)
    update2(2 * node, l, mid, pos);
  else
    update2(2 * node + 1, mid + 1, r, pos);
  aint[node].minv = min(aint[2 * node].minv, aint[2 * node + 1].minv);
}
Girl query(int node, int l, int r, int a, int b) {
  propag(node, l, r);
  if (a <= l && r <= b) return aint[node].minv;
  Girl ans;
  int mid = (l + r) / 2;
  if (a <= mid) ans = query(2 * node, l, mid, a, b);
  if (b > mid) ans = min(ans, query(2 * node + 1, mid + 1, r, a, b));
  return ans;
}
Girl qry(int a, int b) {
  if (rep[a] == rep[b]) return query(1, 1, k, first[b], first[a]);
  return min(query(1, 1, k, first[rep[a]], first[a]), qry(rmq[0][rep[a]], b));
}
Girl getMin(int a, int b) {
  int l = lca(a, b);
  Girl ans = min(qry(a, l), qry(b, l));
  return ans;
}
int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int i = 1; i <= m; ++i) {
    int x;
    scanf("%d", &x);
    ft[x].push_back(i);
  }
  for (int i = 1; i <= n; ++i) reverse(ft[i].begin(), ft[i].end());
  init(1, 0);
  hp(1, 0, 0);
  build(1, 1, n);
  for (int i = 1; i <= q; ++i) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      int v, u, r;
      scanf("%d%d%d", &u, &v, &r);
      int p = 0;
      while (r) {
        Girl aux = getMin(u, v);
        if (aux.jnc == -1) break;
        sol[++p] = aux.inv;
        update2(1, 1, k, first[aux.jnc]);
        r--;
      }
      printf("%d ", p);
      for (int i = 1; i <= p; ++i) printf("%d ", sol[i]);
      printf("\n");
    } else {
      int u, p;
      scanf("%d%d", &u, &p);
      update1(1, 1, k, first[u], last[u], p);
    }
  }
  return 0;
}
