#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 300000;
const long long inf = 10000000000000000LL;
int n, m, q, i, op, x, y, g[N], v[N << 1], nxt[N << 1], ed;
int f[N], d[N], size[N], son[N], top[N], st[N], en[N], dfn;
int c[N], cnt, fin[N];
set<pair<long long, int> > seq[N];
pair<long long, int> val[M];
long long tag[M];
inline void add(int x, int y) {
  v[++ed] = y;
  nxt[ed] = g[x];
  g[x] = ed;
}
void dfs(int x) {
  size[x] = 1;
  for (int i = g[x]; i; i = nxt[i])
    if (v[i] != f[x]) {
      f[v[i]] = x, d[v[i]] = d[x] + 1;
      dfs(v[i]);
      size[x] += size[v[i]];
      if (size[v[i]] > size[son[x]]) son[x] = v[i];
    }
}
void dfs2(int x, int y) {
  st[x] = ++dfn;
  top[x] = y;
  if (son[x]) dfs2(son[x], y);
  for (int i = g[x]; i; i = nxt[i])
    if (v[i] != son[x] && v[i] != f[x]) dfs2(v[i], v[i]);
  en[x] = dfn;
}
inline void tag1(int x, long long p) {
  val[x].first += p;
  tag[x] += p;
}
inline void pb(int x) {
  if (tag[x]) {
    tag1(x << 1, tag[x]);
    tag1(x << 1 | 1, tag[x]);
    tag[x] = 0;
  }
}
inline void up(int x) { val[x] = min(val[x << 1], val[x << 1 | 1]); }
void cal(int x, int a) {
  set<pair<long long, int> >::iterator it = seq[a].begin();
  val[x] = *it;
  val[x].first += tag[x];
}
void build(int x, int a, int b) {
  if (a == b) {
    cal(x, a);
    return;
  }
  int mid = (a + b) >> 1;
  build(x << 1, a, mid), build(x << 1 | 1, mid + 1, b);
  up(x);
}
void del(int x, int a, int b, int c) {
  if (a == b) {
    set<pair<long long, int> >::iterator it = seq[a].begin();
    seq[a].erase(it);
    cal(x, a);
    return;
  }
  pb(x);
  int mid = (a + b) >> 1;
  if (c <= mid)
    del(x << 1, a, mid, c);
  else
    del(x << 1 | 1, mid + 1, b, c);
  up(x);
}
void change(int x, int a, int b, int c, int d, long long p) {
  if (c <= a && b <= d) {
    tag1(x, p);
    return;
  }
  pb(x);
  int mid = (a + b) >> 1;
  if (c <= mid) change(x << 1, a, mid, c, d, p);
  if (d > mid) change(x << 1 | 1, mid + 1, b, c, d, p);
  up(x);
}
pair<long long, int> ask(int x, int a, int b, int c, int d) {
  if (c <= a && b <= d) return val[x];
  pb(x);
  int mid = (a + b) >> 1;
  pair<long long, int> t(inf, 0);
  if (c <= mid) t = ask(x << 1, a, mid, c, d);
  if (d > mid) t = min(t, ask(x << 1 | 1, mid + 1, b, c, d));
  up(x);
  return t;
}
inline pair<long long, int> chain(int x, int y) {
  pair<long long, int> t(inf, 0);
  for (; top[x] != top[y]; x = f[top[x]]) {
    if (d[top[x]] < d[top[y]]) swap(x, y);
    t = min(t, ask(1, 1, n, st[top[x]], st[x]));
  }
  if (d[x] < d[y]) swap(x, y);
  return min(t, ask(1, 1, n, st[y], st[x]));
}
inline void query(int x, int y) {
  int k;
  scanf("%d", &k);
  cnt = 0;
  while (k--) {
    pair<long long, int> t = chain(x, y);
    int u = t.second;
    if (!u) break;
    set<pair<long long, int> >::iterator it = seq[st[u]].begin();
    fin[++cnt] = it->first;
    del(1, 1, n, st[u]);
  }
  printf("%d", cnt);
  for (int i = 1; i <= cnt; i++) printf(" %d", fin[i]);
  puts("");
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (i = 1; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
  dfs(1);
  dfs2(1, 1);
  for (i = 1; i <= n; i++) seq[i].insert(pair<long long, int>(inf, 0));
  for (i = 1; i <= m; i++) {
    scanf("%d", &c[i]);
    seq[st[c[i]]].insert(pair<long long, int>(i, c[i]));
  }
  build(1, 1, n);
  while (q--) {
    scanf("%d%d%d", &op, &x, &y);
    if (op == 1)
      query(x, y);
    else {
      change(1, 1, n, st[x], en[x], y);
    }
  }
  return 0;
}
