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>
using namespace std;
vector<int> v[100005], arr[17][100005], per[100005], res;
int depth[100005], par[17][100005], rescnt;
void dfs(int n, int p, int d) {
  depth[n] = d;
  par[0][n] = p;
  for (int i = 0; i < v[n].size(); i++)
    if (v[n][i] != p) dfs(v[n][i], n, d + 1);
}
void addthis(int i, int j) {
  int a = 0, b = 0, c, d;
  int sz1 = arr[i][j].size();
  int sz2 = res.size();
  int sz = 0;
  vector<int> res1;
  while (a < sz1 && b < sz2 && sz < 10) {
    c = arr[i][j][a];
    d = res[b];
    if (c == d) {
      res1.push_back(c);
      a++;
      b++;
    } else if (c < d) {
      res1.push_back(c);
      a++;
    } else {
      res1.push_back(d);
      b++;
    }
    sz++;
  }
  while (a < sz1 && sz < 10) {
    res1.push_back(arr[i][j][a]);
    a++;
    sz++;
  }
  while (b < sz2 && sz < 10) {
    res1.push_back(res[b]);
    b++;
    sz++;
  }
  res.clear();
  for (int i = 0; i < sz; i++) res.push_back(res1[i]);
  rescnt = sz;
}
int main() {
  std::ios::sync_with_stdio(false);
  int n, m, q, a, b, i, j, k, sz1, sz2, sz, c, d, u, v1, num, temp;
  cin >> n >> m >> q;
  for (i = 0; i < n - 1; i++) {
    cin >> a >> b;
    a--;
    b--;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  for (i = 0; i < m; i++) {
    cin >> a;
    a--;
    per[a].push_back(i);
  }
  dfs(0, -1, 0);
  for (int i = 1; i < 17; i++)
    for (int j = 0; j < n; j++) {
      if (par[i - 1][j] != -1)
        par[i][j] = par[i - 1][par[i - 1][j]];
      else
        par[i][j] = -1;
    }
  for (i = 0; i < n; i++) {
    j = par[0][i];
    if (j == -1) continue;
    a = 0;
    b = 0;
    sz1 = per[i].size();
    sz2 = per[j].size();
    sz = 0;
    while (a < sz1 && b < sz2 && sz < 10) {
      if (per[i][a] < per[j][b]) {
        arr[0][i].push_back(per[i][a]);
        a++;
      } else {
        arr[0][i].push_back(per[j][b]);
        b++;
      }
      sz++;
    }
    while (a < sz1 && sz < 10) {
      arr[0][i].push_back(per[i][a]);
      a++;
      sz++;
    }
    while (b < sz2 && sz < 10) {
      arr[0][i].push_back(per[j][b]);
      b++;
      sz++;
    }
  }
  for (i = 1; i < 17; i++)
    for (j = 0; j < n; j++) {
      if (par[i][j] == -1) continue;
      k = par[i - 1][j];
      a = 0;
      b = 0;
      sz1 = arr[i - 1][j].size();
      sz2 = arr[i - 1][k].size();
      sz = 0;
      while (a < sz1 && b < sz2 && sz < 10) {
        c = arr[i - 1][j][a];
        d = arr[i - 1][k][b];
        if (c == d) {
          arr[i][j].push_back(c);
          a++;
          b++;
        } else if (c < d) {
          arr[i][j].push_back(c);
          a++;
        } else {
          arr[i][j].push_back(d);
          b++;
        }
        sz++;
      }
      while (a < sz1 && sz < 10) {
        arr[i][j].push_back(arr[i - 1][j][a]);
        a++;
        sz++;
      }
      while (b < sz2 && sz < 10) {
        arr[i][j].push_back(arr[i - 1][k][b]);
        b++;
        sz++;
      }
    }
  while (q--) {
    res.clear();
    rescnt = 0;
    cin >> u >> v1 >> num;
    u--;
    v1--;
    if (u == v1) {
      rescnt = per[u].size();
      rescnt = min(rescnt, num);
      cout << rescnt << " ";
      for (i = 0; i < rescnt; i++) cout << (per[u][i] + 1) << " ";
      cout << endl;
      continue;
    }
    if (depth[u] < depth[v1]) {
      temp = u;
      u = v1;
      v1 = temp;
    }
    int diff = depth[u] - depth[v1];
    for (i = 0; i < 17; i++)
      if ((diff >> i) & 1) {
        addthis(i, u);
        u = par[i][u];
      }
    if (u == v1) {
      rescnt = min(rescnt, num);
      cout << rescnt << " ";
      for (i = 0; i < rescnt; i++) cout << res[i] + 1 << " ";
      cout << endl;
      continue;
    }
    for (i = 17 - 1; i >= 0; i--)
      if (par[i][u] != par[i][v1]) {
        addthis(i, u);
        addthis(i, v1);
        u = par[i][u];
        v1 = par[i][v1];
      }
    addthis(0, u);
    addthis(0, v1);
    rescnt = min(rescnt, num);
    cout << rescnt << " ";
    for (i = 0; i < rescnt; i++) cout << res[i] + 1 << " ";
    cout << endl;
  }
  return 0;
}