#include <bits/stdc++.h>
using namespace std;
inline long long rd() {
  long long x = 0;
  int ch = getchar(), f = 1;
  while (!isdigit(ch) && (ch != '-') && (ch != EOF)) ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void rt(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10)
    rt(x / 10), putchar(x % 10 + '0');
  else
    putchar(x + '0');
}
const int maxn = 100005;
int to[maxn << 1], nx[maxn << 1], hd[maxn], cnt;
void addedge(int u, int v) {
  to[cnt] = v;
  nx[cnt] = hd[u];
  hd[u] = cnt++;
}
int size[maxn], son[maxn], fa[maxn], dep[maxn];
void dfs(int u) {
  size[u] = 1;
  for (int i = hd[u]; ~i; i = nx[i]) {
    int v = to[i];
    if (v == fa[u]) continue;
    fa[v] = u;
    dep[v] = dep[u] + 1;
    dfs(v);
    size[u] += size[v];
    if (!son[u] || size[v] > size[son[u]]) son[u] = v;
  }
}
int top[maxn], st[maxn], ed[maxn], tim;
void dfs(int u, int tp) {
  top[u] = tp;
  st[u] = ++tim;
  if (son[u]) dfs(son[u], tp);
  for (int i = hd[u]; ~i; i = nx[i]) {
    int v = to[i];
    if (v == fa[u] || v == son[u]) continue;
    dfs(v, v);
  }
  ed[u] = tim;
}
vector<int> girl[maxn];
pair<long long, int> mn[maxn << 2];
long long ex[maxn << 2];
int head[maxn];
void allsort(int i, int l, int r) {
  if (l == r) {
    sort(girl[l].begin(), girl[l].end());
    mn[i] = make_pair(girl[l].size() > 0 ? girl[l][0] : (1ll << 60), l);
    return;
  }
  int mid = l + r >> 1;
  allsort(i << 1, l, mid), allsort(i << 1 | 1, mid + 1, r);
  mn[i] = min(mn[i << 1], mn[i << 1 | 1]);
}
int n, m, q, ac, ans[maxn];
void pushdown(int i) {
  if (ex[i]) {
    mn[i << 1].first += ex[i], mn[i << 1 | 1].first += ex[i];
    ex[i << 1] += ex[i], ex[i << 1 | 1] += ex[i];
    ex[i] = 0;
  }
}
pair<long long, int> query(int i, int l, int r, int fr, int bh) {
  if (l == fr && r == bh) return mn[i];
  int mid = l + r >> 1;
  pushdown(i);
  if (bh <= mid)
    return query(i << 1, l, mid, fr, bh);
  else if (fr > mid)
    return query(i << 1 | 1, mid + 1, r, fr, bh);
  else
    return min(query(i << 1, l, mid, fr, mid),
               query(i << 1 | 1, mid + 1, r, mid + 1, bh));
}
void del(int i, int l, int r, int ps) {
  if (l == r) {
    head[l]++;
    mn[i] = make_pair(
        head[l] < girl[l].size() ? girl[l][head[l]] + ex[i] : (1ll << 60), l);
    return;
  }
  pushdown(i);
  int mid = l + r >> 1;
  if (ps <= mid)
    del(i << 1, l, mid, ps);
  else
    del(i << 1 | 1, mid + 1, r, ps);
  mn[i] = min(mn[i << 1], mn[i << 1 | 1]);
}
void solve(int u, int v) {
  pair<long long, int> nom = make_pair((1ll << 60) - 1, -1);
  while (top[u] != top[v]) {
    if (dep[top[u]] > dep[top[v]]) swap(u, v);
    nom = min(nom, query(1, 1, n, st[top[v]], st[v]));
    v = fa[top[v]];
  }
  if (dep[u] > dep[v]) swap(u, v);
  nom = min(nom, query(1, 1, n, st[u], st[v]));
  if (nom.second == -1)
    ans[++ac] = -1;
  else {
    ans[++ac] = girl[nom.second][head[nom.second]];
    del(1, 1, n, nom.second);
  }
}
void addweight(int i, int l, int r, int fr, int bh, int v) {
  if (l == fr && r == bh) {
    mn[i].first += v, ex[i] += v;
    return;
  }
  int mid = l + r >> 1;
  pushdown(i);
  if (bh <= mid)
    addweight(i << 1, l, mid, fr, bh, v);
  else if (fr > mid)
    addweight(i << 1 | 1, mid + 1, r, fr, bh, v);
  else
    addweight(i << 1, l, mid, fr, mid, v),
        addweight(i << 1 | 1, mid + 1, r, mid + 1, bh, v);
  mn[i] = min(mn[i << 1], mn[i << 1 | 1]);
}
int main() {
  n = rd(), m = rd(), q = rd();
  memset(hd, -1, sizeof hd);
  for (int i = 1; i <= (int)n - 1; i++) {
    int u = rd(), v = rd();
    addedge(u, v), addedge(v, u);
  }
  dfs(1), dfs(1, 1);
  for (int i = 1; i <= (int)m; i++) {
    int c = rd();
    girl[st[c]].push_back(i);
  }
  allsort(1, 1, n);
  for (int i = 1; i <= (int)q; i++) {
    int opt = rd();
    if (opt == 1) {
      int u = rd(), v = rd(), k = rd();
      ac = 0;
      for (int i = 1; i <= (int)k; i++) {
        solve(u, v);
        if (ans[ac] == -1) {
          ac--;
          break;
        }
      }
      rt(ac), putchar(' ');
      for (int i = 1; i <= (int)ac; i++) rt(ans[i]), putchar(' ');
      putchar('\n');
    } else {
      int u = rd(), k = rd();
      addweight(1, 1, n, st[u], ed[u], k);
    }
  }
}
