#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, q;
int c[N];
vector<pair<long long, int> > girl[N];
int head[N], to[N * 2], pre[N * 2], tot;
void addedge(int u, int v) {
  to[++tot] = v;
  pre[tot] = head[u];
  head[u] = tot;
}
int L[N], R[N], dfn, id[N], dep[N], top[N], son[N], fa[N];
int dfs1(int u, int depth) {
  dep[u] = depth;
  int mx = 0, sum = 1, tmp;
  for (int v, i = head[u]; i; i = pre[i])
    if ((v = to[i]) != fa[u]) {
      fa[v] = u;
      tmp = dfs1(v, depth + 1);
      if (tmp > mx) mx = tmp, son[u] = v;
      sum += tmp;
    }
  return sum;
}
void dfs2(int u, int anc) {
  top[u] = anc;
  L[u] = ++dfn;
  id[dfn] = u;
  if (son[u]) dfs2(son[u], anc);
  for (int i = head[u]; i; i = pre[i])
    if (to[i] != fa[u] && to[i] != son[u]) dfs2(to[i], to[i]);
  R[u] = dfn;
}
pair<long long, int> min(pair<long long, int> a, pair<long long, int> b) {
  if (a.first < b.first) return a;
  if (a.first > b.first) return b;
  if (c[a.second] < c[b.second]) return a;
  return b;
}
pair<long long, int> mi[N * 4];
long long add[N * 4];
void up(int i) {
  mi[i] = min(mi[i << 1], mi[i << 1 | 1]);
  mi[i].first += add[i];
}
void build(int i, int l, int r) {
  if (l == r) {
    if (girl[id[l]].begin() == girl[id[l]].end())
      mi[i] = make_pair((1e17), (0));
    else
      mi[i] = *(girl[id[l]].end() - 1);
    return;
  }
  int mid = (l + r) >> 1;
  build(i << 1, l, mid);
  build(i << 1 | 1, mid + 1, r);
  up(i);
}
pair<long long, int> ans;
pair<long long, int> query(int i, int l, int r, int opl, int opr) {
  if (l == opl && r == opr) return mi[i];
  pair<long long, int> ans;
  int mid = (l + r) >> 1;
  if (opr <= mid)
    ans = query(i << 1, l, mid, opl, opr);
  else if (mid < opl)
    ans = query(i << 1 | 1, mid + 1, r, opl, opr);
  else
    ans = min(query(i << 1, l, mid, opl, mid),
              query(i << 1 | 1, mid + 1, r, mid + 1, opr));
  ans.first += add[i];
  return ans;
}
void work(int i, int l, int r, int pos) {
  if (l == r) {
    girl[id[l]].pop_back();
    if (girl[id[l]].begin() == girl[id[l]].end())
      mi[i] = make_pair((1e17), (0));
    else
      mi[i] = *(girl[id[l]].end() - 1);
    mi[i].first += add[i];
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    work(i << 1, l, mid, pos);
  else
    work(i << 1 | 1, mid + 1, r, pos);
  up(i);
}
int work(int u, int v) {
  ans = make_pair((1e17), (0));
  while (top[u] != top[v]) {
    if (dep[top[u]] < dep[top[v]]) swap(u, v);
    ans = min(query(1, 1, n, L[top[u]], L[u]), ans);
    u = fa[top[u]];
  }
  if (dep[u] > dep[v]) swap(u, v);
  ans = min(ans, query(1, 1, n, L[u], L[v]));
  if (ans.first == 1e17) return -1;
  work(1, 1, n, L[c[ans.second]]);
  return ans.second;
}
void updata(int i, int l, int r, int opl, int opr, long long k) {
  if (l == opl && r == opr) {
    add[i] += k;
    mi[i].first += k;
    return;
  }
  int mid = (l + r) >> 1;
  if (opr <= mid)
    updata(i << 1, l, mid, opl, opr, k);
  else if (mid < opl)
    updata(i << 1 | 1, mid + 1, r, opl, opr, k);
  else
    updata(i << 1, l, mid, opl, mid, k),
        updata(i << 1 | 1, mid + 1, r, mid + 1, opr, k);
  up(i);
}
int num, tmp[N];
int main() {
  int ty, u, v, k;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    addedge(u, v);
    addedge(v, u);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d", &c[i]);
    girl[c[i]].push_back(make_pair((i), (i)));
  }
  dfs1(1, 1);
  dfs2(1, 1);
  for (int i = 1; i <= n; i++)
    sort(girl[i].begin(), girl[i].end(), greater<pair<long long, int> >());
  build(1, 1, n);
  for (int i = 1; i <= q; i++) {
    scanf("%d", &ty);
    if (ty == 1) {
      scanf("%d%d%d", &u, &v, &k);
      num = 0;
      while (k--) {
        tmp[++num] = work(u, v);
        if (tmp[num] == -1) {
          num--;
          break;
        }
      }
      printf("%d ", num);
      for (int i = 1; i <= num; i++) printf("%d ", tmp[i]);
      puts("");
    } else {
      scanf("%d%d", &u, &k);
      updata(1, 1, n, L[u], R[u], k);
    }
  }
  return 0;
}
