Problem: Recently Duff has been a soldier in the army. Malek is her commander.

Their country, Andarz Gu has n cities (numbered from 1 to n) and n - 1 bidirectional roads. Each road connects two different cities. There exist a unique path between any two cities.

There are also m people living in Andarz Gu (numbered from 1 to m). Each person has and ID number. ID number of i - th person is i and he/she lives in city number ci. Note that there may be more than one person in a city, also there may be no people living in the city.

<image>

Malek loves to order. That's why he asks Duff to answer to q queries. In each query, he gives her numbers v, u and a.

To answer a query:

Assume there are x people living in the cities lying on the path from city v to city u. Assume these people's IDs are p1, p2, ..., px in increasing order. 

If k = min(x, a), then Duff should tell Malek numbers k, p1, p2, ..., pk in this order. In the other words, Malek wants to know a minimums on that path (or less, if there are less than a people).

Duff is very busy at the moment, so she asked you to help her and answer the queries.

Input

The first line of input contains three integers, n, m and q (1 ≤ n, m, q ≤ 105).

The next n - 1 lines contain the roads. Each line contains two integers v and u, endpoints of a road (1 ≤ v, u ≤ n, v ≠ u).

Next line contains m integers c1, c2, ..., cm separated by spaces (1 ≤ ci ≤ n for each 1 ≤ i ≤ m).

Next q lines contain the queries. Each of them contains three integers, v, u and a (1 ≤ v, u ≤ n and 1 ≤ a ≤ 10).

Output

For each query, print numbers k, p1, p2, ..., pk separated by spaces in one line.

Examples

Input

5 4 5
1 3
1 2
1 4
4 5
2 1 4 3
4 5 6
1 5 2
5 5 10
2 3 3
5 3 1


Output

1 3
2 2 3
0
3 1 2 4
1 2

Note

Graph of Andarz Gu in the sample case is as follows (ID of people in each city are written next to them):

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int N = 1e5 + 100;
const int big = 1e9;
const int mod = 1e6;
int n, m, q, tmr = 1;
vector<int> g[N];
int bsz[N];
int bp[N];
int gl[N];
int num[N];
int sz[N];
int dm[N];
int inum[N];
int kth[N][18];
int tin[N];
int tout[N];
int fr = 1;
vector<int> zhit[N];
struct seg {
  pair<int, int> t[4 * N];
  void bld() {
    for (int i = 0; i < 4 * N; i++) t[i] = {big, 0};
  }
  void upd(int pos, int z, int v = 1, int l = 1, int r = n) {
    if (pos > r || pos < l) return;
    if (l == r) {
      return (void)(t[v] = {z, inum[pos]});
    }
    int m = (l + r) / 2;
    upd(pos, z, v * 2, l, m);
    upd(pos, z, v * 2 + 1, m + 1, r);
    t[v] = min(t[v * 2], t[v * 2 + 1]);
  }
  pair<int, int> get(int l, int r, int v = 1, int tl = 1, int tr = n) {
    if (tr < l || r < tl) return {big, big};
    if (l <= tl && tr <= r) {
      return t[v];
    }
    int m = (tl + tr) / 2;
    pair<int, int> aa = get(l, r, v * 2, tl, m);
    pair<int, int> bb = get(l, r, v * 2 + 1, m + 1, tr);
    return min(aa, bb);
  }
} rt;
int dfs(int v = 1, int L = 0, int p = 0) {
  sz[v] = 1;
  gl[v] = L;
  kth[v][0] = p;
  tin[v] = tmr++;
  for (int i = 1; i < 18; i++) kth[v][i] = kth[kth[v][i - 1]][i - 1];
  for (auto u : g[v])
    if (u != p) sz[v] += dfs(u, L + 1, v);
  tout[v] = tmr++;
  return sz[v];
}
bool upper(int v, int u) { return (tin[v] <= tin[u] && tout[u] <= tout[v]); }
int lca(int a, int b) {
  if (upper(a, b)) return a;
  if (upper(b, a)) return b;
  for (int i = 17; i >= 0; i--) {
    if (!upper(kth[a][i], b)) a = kth[a][i];
  }
  return kth[a][0];
}
void HLD(int v = 1, int p = -1, int rt = 1) {
  num[v] = fr++;
  inum[fr - 1] = v;
  bsz[rt]++;
  bp[v] = rt;
  stack<int> q;
  for (auto u : g[v])
    if (u != p && sz[u] * 2 >= sz[v])
      HLD(u, v, rt);
    else if (u != p)
      q.push(u);
  while (q.size()) HLD(q.top(), v, q.top()), q.pop();
}
pair<int, int> qu2(int a, int b) {
  pair<int, int> ans = {big, big};
  while (1) {
    int prt = bp[a];
    if (bp[b] == bp[a]) prt = b;
    pair<int, int> xxx = rt.get(num[prt], num[a]);
    ans = min(ans, rt.get(num[prt], num[a]));
    if (prt == b) break;
    a = kth[prt][0];
  }
  return ans;
}
int shal[N];
void query(int a, int b, int c) {
  int x = lca(a, b);
  unordered_set<int> qq;
  vector<int> que;
  while (c--) {
    pair<int, int> y = min(qu2(a, x), qu2(b, x));
    if (y.first == big) break;
    que.push_back(y.first);
    shal[y.second]++;
    int nxupd = (shal[y.second] == zhit[y.second].size()
                     ? big
                     : zhit[y.second][shal[y.second]]);
    rt.upd(num[y.second], nxupd);
    qq.insert(y.second);
  }
  for (auto u : qq) shal[u] = 0, rt.upd(num[u], zhit[u][0]);
  cout << que.size() << " ";
  for (auto u : que) cout << u << " ";
  cout << '\n';
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  tin[0] = -big;
  tout[0] = big;
  cin >> n >> m >> q;
  for (int i = (0); i < (n - 1); i += 1) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b), g[b].push_back(a);
  }
  dfs();
  HLD();
  rt.bld();
  for (int i = 1; i <= m; i++) {
    cin >> dm[i];
    if (!zhit[dm[i]].size()) rt.upd(num[dm[i]], i);
    zhit[dm[i]].push_back(i);
  }
  while (q--) {
    int a, b, c;
    cin >> a >> b >> c;
    query(a, b, c);
  }
}