#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 77, L = 18;
const long long inf = 2e18;
int n, m, q, sz[N], dis[N], Par[N][L], st[N], en[N], Top[N], C[N], Wh[N],
    tim = 1;
long long lz[N << 2], S[N << 2];
pair<long long, int> Mn[N << 2];
vector<int> a[N], V[N];
bool CMP(int x, int y) { return sz[x] > sz[y]; }
void dfsPre(int v = 1, int prev = -1) {
  for (int i = 1; i < L; ++i) {
    Par[v][i] = Par[Par[v][i - 1]][i - 1];
  }
  sz[v] = 1;
  for (int u : a[v]) {
    if (u == prev) {
      continue;
    }
    Par[u][0] = v;
    dis[u] = dis[v] + 1;
    dfsPre(u, v);
    sz[v] += sz[u];
  }
  sort(a[v].begin(), a[v].end(), CMP);
}
void dfsHld(int v = 1, int prev = -1) {
  Wh[tim] = v;
  st[v] = tim++;
  int ch = 0;
  for (int u : a[v]) {
    if (u == prev) {
      continue;
    }
    if (++ch == 1) {
      Top[u] = Top[v];
    } else {
      Top[u] = u;
    }
    dfsHld(u, v);
  }
  en[v] = tim;
}
inline int GetPar(int v, int k) {
  for (int i = 0; i < L; ++i) {
    if (k & (1 << i)) {
      v = Par[v][i];
    }
  }
  return v;
}
inline int GetLca(int v, int u) {
  if (dis[v] < dis[u]) {
    swap(v, u);
  }
  v = GetPar(v, dis[v] - dis[u]);
  if (v == u) {
    return v;
  }
  for (int i = L - 1; i >= 0; --i) {
    if (Par[v][i] != Par[u][i]) {
      v = Par[v][i];
      u = Par[u][i];
    }
  }
  return Par[v][0];
}
inline void Shift(int l, int r, int id) {
  long long x = lz[id];
  lz[id] = 0;
  S[id] += x;
  Mn[id].first += x;
  if (r - l > 1) {
    lz[id << 1] += x;
    lz[id << 1 ^ 1] += x;
  }
}
void Build(int l = 1, int r = n + 1, int id = 1) {
  if (r - l < 2) {
    int v = Wh[l];
    if (!V[v].empty()) {
      Mn[id] = make_pair(V[v].back(), v);
    }
    return;
  }
  int mid = ((l + r) >> 1);
  Build(l, mid, id << 1);
  Build(mid, r, id << 1 ^ 1);
  Mn[id] = min(Mn[id << 1], Mn[id << 1 ^ 1]);
}
void Update(int x, int l = 1, int r = n + 1, int id = 1) {
  Shift(l, r, id);
  if (x < l || r <= x) {
    return;
  }
  if (r - l < 2) {
    int v = Wh[l];
    if (!V[v].empty()) {
      Mn[id] = make_pair(V[v].back() + S[id], v);
    }
    return;
  }
  int mid = ((l + r) >> 1);
  Update(x, l, mid, id << 1);
  Update(x, mid, r, id << 1 ^ 1);
  Mn[id] = min(Mn[id << 1], Mn[id << 1 ^ 1]);
}
void Erase(int x, int l = 1, int r = n + 1, int id = 1) {
  if (x < l || r <= x) {
    return;
  }
  if (r - l < 2) {
    Mn[id] = make_pair(inf, -1);
    return;
  }
  int mid = ((l + r) >> 1);
  Erase(x, l, mid, id << 1);
  Erase(x, mid, r, id << 1 ^ 1);
  Mn[id] = min(Mn[id << 1], Mn[id << 1 ^ 1]);
}
pair<long long, int> Get(int ql, int qr, int l = 1, int r = n + 1, int id = 1) {
  Shift(l, r, id);
  if (qr <= l || r <= ql) {
    return make_pair(inf, -1);
  }
  if (ql <= l && r <= qr) {
    return make_pair(Mn[id].first, Mn[id].second);
  }
  int mid = ((l + r) >> 1);
  return min(Get(ql, qr, l, mid, id << 1), Get(ql, qr, mid, r, id << 1 ^ 1));
}
void Add(int ql, int qr, int x, int l = 1, int r = n + 1, int id = 1) {
  Shift(l, r, id);
  if (qr <= l || r <= ql) {
    return;
  }
  if (ql <= l && r <= qr) {
    lz[id] += x;
    Shift(l, r, id);
    return;
  }
  int mid = ((l + r) >> 1);
  Add(ql, qr, x, l, mid, id << 1);
  Add(ql, qr, x, mid, r, id << 1 ^ 1);
  Mn[id] = min(Mn[id << 1], Mn[id << 1 ^ 1]);
}
pair<long long, int> GetMinup(int v, int d) {
  pair<long long, int> res = make_pair(inf, -1);
  while (dis[v] - dis[Top[v]] < d) {
    int p = Top[v];
    res = min(res, Get(st[p], st[v] + 1));
    d -= dis[v] - dis[p] + 1;
    v = Par[p][0];
  }
  int p = GetPar(v, d);
  res = min(res, Get(st[p], st[v] + 1));
  return res;
}
pair<long long, int> GetMin(int v, int u) {
  int LCA = GetLca(v, u);
  return min(GetMinup(v, dis[v] - dis[LCA]), GetMinup(u, dis[u] - dis[LCA]));
}
inline void Query(int v, int u, int k) {
  vector<int> A;
  while (k--) {
    pair<long long, int> Ma = GetMin(v, u);
    int vv = Ma.second;
    if (vv == -1) {
      break;
    }
    A.push_back(V[vv].back());
    V[vv].pop_back();
    Erase(st[vv]);
    Update(st[vv]);
  }
  printf("%d ", (int)A.size());
  for (int x : A) {
    printf("%d ", x);
  }
  printf("\n");
}
int main() {
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 1; i < n; ++i) {
    int v, u;
    cin >> v >> u;
    a[v].push_back(u);
    a[u].push_back(v);
  }
  Top[1] = 1;
  dfsPre();
  dfsHld();
  for (int i = 1; i <= m; ++i) {
    cin >> C[i];
    V[C[i]].push_back(i);
  }
  for (int i = 1; i <= n; ++i) {
    reverse(V[i].begin(), V[i].end());
  }
  for (int i = 0; i < (N << 2); ++i) {
    Mn[i] = make_pair(inf, -1);
  }
  Build();
  while (q--) {
    int tp;
    scanf("%d", &tp);
    if (tp == 2) {
      int v, k;
      scanf("%d %d", &v, &k);
      Add(st[v], en[v], k);
      continue;
    }
    int v, u, k;
    scanf("%d %d %d", &v, &u, &k);
    Query(v, u, k);
  }
  return 0;
}
