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> graph[100005], person[100005];
vector<pair<int, int> > qq[100005];
vector<int> answer[100005];
int parent[100005], ancestor[100005], above[100005], total[100005],
    visited[100005], lca[100005];
bool pre[100005];
pair<int, int> tree[4 * 100005];
void build(int node, int a, int b) {
  if (a > b) return;
  if (a == b) {
    tree[node] = make_pair(1000000000, a);
    return;
  }
  int left, right;
  left = 2 * node, right = 2 * node + 1;
  build(left, a, (a + b) / 2);
  build(right, (a + b) / 2 + 1, b);
  tree[node] = make_pair(1000000000, a);
}
void update(int node, int a, int b, int i, int j, int val) {
  int left, right;
  left = 2 * node, right = 2 * node + 1;
  if (a > b || a > j || b < i) return;
  if (a == b) {
    tree[node] = make_pair(val, a);
    return;
  }
  update(left, a, (a + b) / 2, i, j, val);
  update(right, (a + b) / 2 + 1, b, i, j, val);
  int temp = min(tree[left].first, tree[right].first);
  tree[node] = make_pair(
      temp, tree[left].first == temp ? tree[left].second : tree[right].second);
}
pair<int, int> query(int node, int a, int b, int i, int j) {
  int left, right;
  left = 2 * node, right = 2 * node + 1;
  if (a > b || a > j || b < i) return make_pair(1000000000, -1);
  if (a >= i && b <= j) return tree[node];
  pair<int, int> c, d;
  c = query(left, a, (a + b) / 2, i, j);
  d = query(right, (a + b) / 2 + 1, b, i, j);
  int temp = min(c.first, d.first);
  return make_pair(temp, c.first == temp ? c.second : d.second);
}
int find(int x) {
  if (x != parent[x]) parent[x] = find(parent[x]);
  return parent[x];
}
void Union(int x, int y, int new_ancestor) {
  int xroot = find(x), yroot = find(y);
  parent[xroot] = y, ancestor[yroot] = new_ancestor;
}
void dfs(int v, int p, int num) {
  visited[v] = 1;
  parent[v] = ancestor[v] = v;
  above[v] = p;
  num += person[v].size();
  total[v] = num;
  for (int i = 0; i < graph[v].size(); i++) {
    int u = graph[v][i];
    if (!visited[u]) {
      dfs(u, v, num);
      Union(v, u, v);
    }
  }
  for (int i = 0; i < qq[v].size(); i++) {
    int u = qq[v][i].first, j = qq[v][i].second;
    if (visited[u]) {
      int index = ancestor[find(u)];
      lca[j] = index;
    }
  }
}
void dfs1(int v) {
  visited[v] = 2;
  int j = total[above[v]] + 1;
  for (int i = 0; i < person[v].size(); i++)
    update(1, 1, 100005 - 1, i + j, i + j, person[v][i]);
  for (int i = 0; i < qq[v].size(); i++) {
    int a, b, node;
    a = qq[v][i].first, b = qq[v][i].second;
    node = lca[b];
    vector<pair<int, int> > position;
    if (!pre[b]) {
      int j = 0;
      while (j < 10) {
        pair<int, int> temp =
            query(1, 1, 100005 - 1, total[above[node]] + 1, total[v]);
        if (temp.first == 1000000000) {
          break;
        }
        update(1, 1, 100005 - 1, temp.second, temp.second, 1000000000);
        position.push_back(temp);
        answer[b].push_back(temp.first);
        j++;
      }
      pre[b] = true;
      for (int j = 0; j < position.size(); j++) {
        update(1, 1, 100005 - 1, position[j].second, position[j].second,
               position[j].first);
      }
    } else {
      int j = 0;
      while (j < 10) {
        pair<int, int> temp =
            query(1, 1, 100005 - 1, total[node] + 1, total[v]);
        if (temp.first == 1000000000) {
          break;
        }
        update(1, 1, 100005 - 1, temp.second, temp.second, 1000000000);
        position.push_back(temp);
        answer[b].push_back(temp.first);
        j++;
      }
      for (int j = 0; j < position.size(); j++)
        update(1, 1, 100005 - 1, position[j].second, position[j].second,
               position[j].first);
    }
  }
  for (int i = 0; i < graph[v].size(); i++) {
    int u = graph[v][i];
    if (visited[u] == 1) {
      dfs1(u);
    }
  }
  j = total[above[v]] + 1;
  for (int i = 0; i < person[v].size(); i++)
    update(1, 1, 100005 - 1, i + j, i + j, 1000000000);
}
int main() {
  int n, m, q;
  scanf("%d %d %d", &n, &m, &q);
  build(1, 1, 100005 - 1);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  for (int i = 1; i <= m; i++) {
    int a;
    scanf("%d", &a);
    person[a].push_back(i);
  }
  pair<int, pair<int, int> > arr[q];
  for (int i = 0; i < q; i++) {
    scanf("%d %d %d", &arr[i].first, &arr[i].second.first,
          &arr[i].second.second);
    qq[arr[i].first].push_back(make_pair(arr[i].second.first, i));
    qq[arr[i].second.first].push_back(make_pair(arr[i].first, i));
  }
  dfs(1, 0, 0);
  dfs1(1);
  for (int i = 0; i < q; i++) {
    int temp = min((int)answer[i].size(), arr[i].second.second);
    printf("%d ", temp);
    sort(answer[i].begin(), answer[i].end());
    for (int j = 0; j < temp; j++) printf("%d ", answer[i][j]);
    printf("\n");
  }
  return 0;
}