#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int MOD = 1000000007;
const long long INF = LLONG_MAX / 3;
int N, M, Q;
vector<int> adj[MAXN];
vector<int> W[MAXN];
int p[MAXN];
int sze[MAXN];
int sd[MAXN];
int id[MAXN], idx = 0;
int sb[MAXN];
int seg[MAXN], segx = 0;
int te[MAXN];
void szdfs(int v, int par) {
  p[v] = par;
  sze[v] = 1;
  for (auto i : adj[v])
    if (i != par) {
      szdfs(i, v);
      sze[v] += sze[i];
    }
}
void hld(int v, int sdx, int sbase) {
  id[v] = ++idx;
  seg[v] = segx;
  sd[v] = sdx;
  sb[v] = sbase;
  int big = -1;
  for (auto i : adj[v])
    if (i != p[v]) {
      if (big == -1 || sze[i] > sze[big]) big = i;
    }
  if (big != -1) hld(big, sdx, sbase);
  for (auto i : adj[v])
    if (i != p[v] && i != big) {
      segx++;
      hld(i, sdx + 1, i);
    }
  te[v] = idx;
}
struct node {
  pair<long long, long long> mn;
  long long a;
} t[4 * MAXN];
void build(int id, int s, int e) {
  if (s == e) {
    t[id].mn = pair<long long, long long>(INF, -1);
    return;
  }
  int m = (s + e) >> 1;
  build(2 * id, s, m);
  build(2 * id + 1, m + 1, e);
  t[id].mn = min(t[2 * id].mn, t[2 * id + 1].mn);
}
void selfadd(int id, long long v) {
  t[id].mn.first += v;
  t[id].a += v;
}
void prop(int id) {
  selfadd(2 * id, t[id].a);
  selfadd(2 * id + 1, t[id].a);
  t[id].a = 0;
}
pair<long long, long long> rmin(int id, int s, int e, int x, int y) {
  if (s == x && e == y) {
    return t[id].mn;
  }
  int m = (s + e) >> 1;
  prop(id);
  if (y <= m) return rmin(2 * id, s, m, x, y);
  if (x > m) return rmin(2 * id + 1, m + 1, e, x, y);
  return min(rmin(2 * id, s, m, x, m), rmin(2 * id + 1, m + 1, e, m + 1, y));
}
void radd(int id, int s, int e, int x, int y, long long v) {
  if (s == x && e == y) {
    selfadd(id, v);
    return;
  }
  int m = (s + e) >> 1;
  prop(id);
  if (x <= m) radd(2 * id, s, m, x, min(m, y), v);
  if (y > m) radd(2 * id + 1, m + 1, e, max(m + 1, x), y, v);
  t[id].mn = min(t[2 * id].mn, t[2 * id + 1].mn);
}
void pset(int id, int s, int e, int x, pair<long long, long long> v) {
  if (s == x && e == x) {
    t[id].mn = v;
    return;
  }
  int m = (s + e) >> 1;
  prop(id);
  if (x <= m)
    pset(2 * id, s, m, x, v);
  else
    pset(2 * id + 1, m + 1, e, x, v);
  t[id].mn = min(t[2 * id].mn, t[2 * id + 1].mn);
}
pair<long long, long long> query(int a, int b) {
  if (sd[a] > sd[b]) swap(a, b);
  int d = sd[b] - sd[a];
  pair<long long, long long> res(INF, -1);
  for (int i = (0); i <= (d - 1); i++) {
    res = min(res, rmin(1, 1, N, id[sb[b]], id[b]));
    b = p[sb[b]];
  }
  assert(sd[a] == sd[b]);
  while (seg[a] != seg[b]) {
    res = min(res, rmin(1, 1, N, id[sb[a]], id[a]));
    res = min(res, rmin(1, 1, N, id[sb[b]], id[b]));
    a = p[sb[a]];
    b = p[sb[b]];
  }
  assert(seg[a] == seg[b]);
  if (id[a] > id[b]) swap(a, b);
  res = min(res, rmin(1, 1, N, id[a], id[b]));
  return res;
}
void upd(int v, int k) { radd(1, 1, N, id[v], te[v], k); }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> N >> M >> Q;
  for (int i = (1); i <= (N - 1); i++) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  for (int i = (1); i <= (M); i++) {
    int x;
    cin >> x;
    W[x].push_back(i);
  }
  for (int i = (1); i <= (N); i++) reverse((W[i]).begin(), (W[i]).end());
  szdfs(1, -1);
  hld(1, 0, 1);
  build(1, 1, N);
  for (int i = (1); i <= (N); i++)
    if (((int)(W[i]).size())) {
      pset(1, 1, N, id[i], pair<long long, long long>(W[i].back(), i));
    }
  while (Q--) {
    int op, x, y, k;
    cin >> op;
    if (op == 1) {
      cin >> x >> y >> k;
      vector<int> vec;
      while (k--) {
        long long w;
        int v;
        tie(w, v) = query(x, y);
        if (v == -1) break;
        if (!((int)(W[v]).size())) {
          cerr << "v"
               << " = " << v << "\n";
          cerr << "w"
               << " = " << w << "\n";
        }
        vec.push_back(W[v].back());
        long long off = w - W[v].back();
        W[v].pop_back();
        if (((int)(W[v]).size()))
          pset(1, 1, N, id[v],
               pair<long long, long long>(W[v].back() + off, v));
        else
          pset(1, 1, N, id[v], pair<long long, long long>(INF, -1));
      }
      int n = ((int)(vec).size());
      cout << n;
      for (int i = (0); i <= (n - 1); i++) cout << ' ' << vec[i];
      cout << "\n";
    } else {
      cin >> x >> k;
      upd(x, k);
    }
  }
}
