#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const long long inf = 1e15 + 2277;
int h[N], par[20][N], head[N], pos[N], child[N], st[N], en[N], w[N], n, m, q;
int cnt = 0;
long long lazy[4 * N];
vector<int> g[N];
pair<long long, pair<int, int> > node[4 * N], val[N];
vector<long long> city[N];
void input() {
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  h[1] = 0;
  memset(head, 0, sizeof(head));
  memset(par, -1, sizeof(par));
  for (int i = 1; i <= m; i++) {
    scanf("%d", &w[i]);
    city[w[i]].push_back((long long)i);
  }
  for (int i = 1; i <= n; i++) city[i].push_back(inf);
  for (int i = 1; i <= n; i++) sort(city[i].begin(), city[i].end());
}
void dfs(int u, int p) {
  child[u] = 1;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == p) continue;
    h[v] = h[u] + 1;
    par[0][v] = u;
    dfs(v, u);
    child[u] += child[v];
  }
}
void makeLCA() {
  for (int i = 1; i < 20; i++) {
    for (int j = 1; j <= n; j++) {
      if (par[i - 1][j] != -1) par[i][j] = par[i - 1][par[i - 1][j]];
    }
  }
}
int LCA(int x, int y) {
  if (h[x] > h[y]) swap(x, y);
  for (int i = 19; i >= 0; i--) {
    if (par[i][y] != -1 && h[y] - (1 << i) >= h[x]) y = par[i][y];
  }
  if (x == y) return x;
  for (int i = 19; i >= 0; i--) {
    if (par[i][x] != -1 && par[i][y] != -1 && par[i][x] != par[i][y]) {
      x = par[i][x];
      y = par[i][y];
    }
  }
  return (x == y ? x : par[0][x]);
}
void HLD(int u, int p) {
  if (!head[u]) head[u] = u;
  st[u] = pos[u] = ++cnt;
  val[cnt] = make_pair(city[u][0], make_pair(u, 0));
  int big = -1;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == p) continue;
    if (big == -1 || child[big] < child[v]) big = v;
  }
  if (big != -1) {
    head[big] = head[u];
    HLD(big, u);
  }
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == p || v == big) continue;
    HLD(v, u);
  }
  en[u] = cnt;
}
void init(int i, int l, int r) {
  if (l > r) return;
  if (l == r) {
    node[i] = val[l];
    lazy[i] = 0;
    return;
  }
  int m = (l + r) >> 1;
  init(i << 1, l, m);
  init(i << 1 | 1, m + 1, r);
  node[i] = min(node[i << 1], node[i << 1 | 1]);
  lazy[i] = 0;
}
void dolazy(int i, int l, int r) {
  if (lazy[i]) {
    node[i].first += lazy[i];
    if (l != r) {
      lazy[i << 1] += lazy[i];
      lazy[i << 1 | 1] += lazy[i];
    }
    lazy[i] = 0;
  }
}
void update(int i, int l, int r, int a, int b, long long val, int ind) {
  dolazy(i, l, r);
  if (l > r || a > r || b < l) return;
  if (a <= l && r <= b) {
    if (ind) {
      node[i] = make_pair(val, make_pair(node[i].second.first, ind));
    } else {
      node[i].first += val;
      if (l != r) {
        lazy[i << 1] += val;
        lazy[i << 1 | 1] += val;
      }
    }
    return;
  }
  int m = (l + r) >> 1;
  update(i << 1, l, m, a, b, val, ind);
  update(i << 1 | 1, m + 1, r, a, b, val, ind);
  node[i] = min(node[i << 1], node[i << 1 | 1]);
}
pair<long long, pair<int, int> > get(int i, int l, int r, int a, int b) {
  if (l > r || a > r || b < l) return make_pair(inf, make_pair(0, 0));
  dolazy(i, l, r);
  if (a <= l && r <= b) return node[i];
  int m = (l + r) >> 1;
  return min(get(i << 1, l, m, a, b), get(i << 1 | 1, m + 1, r, a, b));
}
pair<long long, pair<int, int> > query(int u, int v) {
  int p = LCA(u, v);
  pair<long long, pair<int, int> > ans = make_pair(inf, make_pair(0, 0));
  while (head[u] != head[p]) {
    ans = min(ans, get(1, 1, cnt, pos[head[u]], pos[u]));
    u = par[0][head[u]];
  }
  ans = min(ans, get(1, 1, cnt, pos[p], pos[u]));
  while (head[v] != head[p]) {
    ans = min(ans, get(1, 1, cnt, pos[head[v]], pos[v]));
    v = par[0][head[v]];
  }
  ans = min(ans, get(1, 1, cnt, pos[p], pos[v]));
  return ans;
}
void solve() {
  while (q--) {
    int type;
    scanf("%d", &type);
    if (type == 2) {
      int u, k;
      scanf("%d %d", &u, &k);
      update(1, 1, cnt, st[u], en[u], k, 0);
    } else {
      int u, v, k;
      scanf("%d %d %d", &u, &v, &k);
      vector<int> res;
      for (int i = 1; i <= k; i++) {
        pair<long long, pair<int, int> > ans = query(u, v);
        if (ans.first >= inf || ans.second.first > n) break;
        res.push_back(city[ans.second.first][ans.second.second]);
        long long nxt =
            (ans.second.second + 1 == city[ans.second.first].size()
                 ? inf
                 : ans.first - city[ans.second.first][ans.second.second] +
                       city[ans.second.first][ans.second.second + 1]);
        update(1, 1, cnt, pos[ans.second.first], pos[ans.second.first], nxt,
               (ans.second.second + 1 == city[ans.second.first].size()
                    ? ans.second.second
                    : ans.second.second + 1));
      }
      printf("%d", (int)res.size());
      for (int i = 0; i < res.size(); i++) printf(" %d", res[i]);
      puts("");
    }
  }
}
signed main() {
  input();
  dfs(1, 1);
  makeLCA();
  HLD(1, 1);
  init(1, 1, cnt);
  solve();
  return 0;
}
