#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
void etp(bool f = 0) {
  puts(f ? "TAK" : "NIE");
  exit(0);
}
void addmod(int &x, int y, int mod = 1000000007) {
  x += y;
  if (x >= mod) x -= mod;
}
void et() {
  puts("-1");
  exit(0);
}
vector<int> mp[100005], girl[100005];
int p[100005][20], d[100005];
int st[100005], ed[100005], cnt = 0, sz[100005], rid[100005];
int chain = 1, be[100005], head[100005], top[100005];
bool vc[100005];
void calSize(int x, int pa) {
  sz[x] = 1;
  d[x] = d[pa] + 1;
  p[x][0] = pa;
  for (int c : mp[x])
    if (c != pa) {
      calSize(c, x);
      sz[x] += sz[c];
    }
}
void dfs(int x, int pa) {
  st[x] = ++cnt;
  rid[cnt] = x;
  be[x] = chain;
  if (!vc[chain]) {
    vc[chain] = 1;
    head[chain] = x;
    top[chain] = pa;
  }
  int mx = -1;
  for (int c : mp[x])
    if (c != pa) mx = max(mx, sz[c]);
  for (int c : mp[x])
    if (c != pa) {
      if (sz[c] == mx) {
        dfs(c, x);
      }
    }
  for (int c : mp[x])
    if (c != pa) {
      if (sz[c] != mx) {
        dfs(c, x);
      }
    }
  ed[x] = cnt;
  if (mx == -1) chain++;
}
void init() {
  for (int j = 1; (1 << j) <= n; j++)
    for (int i = 1; i <= n; i++) p[i][j] = p[p[i][j - 1]][j - 1];
}
int lca(int a, int b) {
  if (d[a] > d[b]) swap(a, b);
  int f = d[b] - d[a];
  for (int i = 0; (1 << i) <= f; i++)
    if ((1 << i) & f) b = p[b][i];
  if (a != b) {
    for (int i = 19; i >= 0; i--)
      if (p[a][i] != p[b][i]) {
        a = p[a][i];
        b = p[b][i];
      }
    a = p[a][0];
  }
  return a;
}
pair<long long, long long> T[100005 * 4];
long long lz[100005 * 4];
void up(int rt) { T[rt] = min(T[(rt << 1)], T[(rt << 1 | 1)]); }
void down(int rt, int l, int r) {
  if (lz[rt] != 0 && l + 1 < r) {
    lz[(rt << 1)] += lz[rt];
    lz[(rt << 1 | 1)] += lz[rt];
    if (T[(rt << 1)].first != (1LL << 60)) T[(rt << 1)].first += lz[rt];
    if (T[(rt << 1 | 1)].first != (1LL << 60)) T[(rt << 1 | 1)].first += lz[rt];
    lz[rt] = 0;
  }
}
void build(int rt, int l, int r) {
  if (l + 1 == r) {
    int x = rid[r];
    if (girl[x].empty())
      T[rt] = {(1LL << 60), (1LL << 60)};
    else
      T[rt] = {girl[x].back(), x};
    return;
  }
  int mid = (l + r) / 2;
  build((rt << 1), l, mid);
  build((rt << 1 | 1), mid, r);
  up(rt);
}
void uptSingle(int rt, int l, int r, int node, long long addi) {
  if (r < node || node <= l) return;
  if (l + 1 == r) {
    int x = rid[r];
    assert(r == node);
    if (girl[x].empty())
      T[rt] = {(1LL << 60), (1LL << 60)};
    else
      T[rt] = {girl[x].back() + addi, x};
    return;
  }
  down(rt, l, r);
  int mid = (l + r) / 2;
  uptSingle((rt << 1), l, mid, node, addi);
  uptSingle((rt << 1 | 1), mid, r, node, addi);
  up(rt);
}
void upt(int rt, int l, int r, int L, int R, int val) {
  if (r <= L || R <= l) return;
  if (L <= l && r <= R) {
    if (T[rt].first != (1LL << 60)) {
      T[rt].first += val;
    }
    lz[rt] += val;
    return;
  }
  down(rt, l, r);
  int mid = (l + r) / 2;
  upt((rt << 1), l, mid, L, R, val);
  upt((rt << 1 | 1), mid, r, L, R, val);
  up(rt);
}
pair<long long, long long> qy(int rt, int l, int r, int L, int R) {
  if (r <= L || R <= l) return {(1LL << 60), (1LL << 60)};
  if (L <= l && r <= R) return T[rt];
  down(rt, l, r);
  int mid = (l + r) / 2;
  return min(qy((rt << 1), l, mid, L, R), qy((rt << 1 | 1), mid, r, L, R));
}
pair<long long, long long> cal(int u, int F) {
  if (be[u] == be[F]) {
    return qy(1, 0, n, st[F] - 1, st[u]);
  }
  pair<long long, long long> tmp = qy(1, 0, n, st[head[be[u]]] - 1, st[u]);
  return min(cal(top[be[u]], F), tmp);
}
void fmain() {
  int q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0, u, v; i < n - 1; i++) {
    scanf("%d%d", &u, &v);
    mp[u].push_back(v);
    mp[v].push_back(u);
  };
  for (int(i) = 1; (i) <= (int)(m); (i)++) {
    scanf("%d", &k);
    girl[k].push_back(i);
  }
  for (int(i) = 1; (i) <= (int)(n); (i)++)
    reverse(girl[i].begin(), girl[i].end());
  calSize(1, 0);
  dfs(1, 0);
  init();
  build(1, 0, n);
  for (int(i) = 0; (i) < (int)(q); (i)++) {
    int t, u, v;
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d%d%d", &u, &v, &k);
      vector<int> ans;
      for (int(j) = 0; (j) < (int)(k); (j)++) {
        int fa = lca(u, v);
        pair<long long, long long> tt = min(cal(u, fa), cal(v, fa));
        if (tt.first == (1LL << 60)) break;
        int x = tt.second;
        assert(!girl[x].empty());
        ans.push_back(girl[x].back());
        long long addWeight = tt.first - girl[x].back();
        girl[x].pop_back();
        uptSingle(1, 0, n, st[x], addWeight);
      }
      printf("%d ", ans.size());
      for (int g : ans) printf("%d ", g);
      puts("");
    } else {
      scanf("%d%d", &v, &k);
      upt(1, 0, n, st[v] - 1, ed[v], k);
    }
  }
}
int main() {
  fmain();
  return 0;
}
