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;
int read() {
  int x;
  scanf("%d", &x);
  return x;
}
const int N = 112345;
int tin[N];
int tout[N];
bool used[N];
vector<int> v[N];
int par[N][20];
vector<int> pac[N][20];
int d[N];
int tim;
vector<int> c[N];
set<int> st;
void dfs(int x, int p, int s) {
  used[x] = 1;
  par[x][0] = p;
  tin[x] = ++tim;
  d[x] = s;
  st.clear();
  for (int i = 0; i < c[x].size(); i++) st.insert(c[x][i]);
  for (int i = 1; i < 20; i++) {
    par[x][i] = par[par[x][i - 1]][i - 1];
  }
  for (int i = 0; i < 20; i++) {
    int e = 10;
    for (set<int>::iterator j = st.begin(); j != st.end(); j++) {
      pac[x][i].push_back((*j));
      e--;
      if (e == 0) break;
    }
    while (st.size() > 10) st.erase(--st.end());
    for (int j = 0; j < pac[par[x][i]][i].size(); j++) {
      st.insert(pac[par[x][i]][i][j]);
    }
  }
  for (int i = 0; i < v[x].size(); i++) {
    int to = v[x][i];
    if (!used[to]) {
      dfs(to, x, s + 1);
    }
  }
  tout[x] = ++tim;
}
bool upper(int a, int b) { return (tin[a] <= tin[b] && tout[a] >= tout[b]); }
int lca(int a, int b) {
  if (upper(a, b)) return a;
  if (upper(b, a)) return b;
  for (int i = 19; i >= 0; i--) {
    if (!upper(par[a][i], b)) {
      a = par[a][i];
    }
  }
  return par[a][0];
}
void xkth(int x, int y) {
  while (y > 0) {
    for (int i = 0; i < 20; i++) {
      if ((1 << i) > y) {
        for (int j = 0; j < pac[x][i - 1].size(); j++)
          st.insert(pac[x][i - 1][j]);
        y -= (1 << (i - 1));
        x = par[x][i - 1];
        break;
      }
    }
  }
  for (int i = 0; i < pac[x][0].size(); i++) st.insert(pac[x][0][i]);
}
int main() {
  int n, m, i, j, q;
  n = read();
  m = read();
  q = read();
  for (i = 2; i <= n; i++) {
    int x, y;
    x = read();
    y = read();
    v[x].push_back(y);
    v[y].push_back(x);
  }
  for (i = 1; i <= m; i++) {
    int x;
    x = read();
    c[x].push_back(i);
  }
  for (i = 0; i < 20; i++) par[1][i] = 1;
  dfs(1, 1, 0);
  for (i = 1; i <= q; i++) {
    int x, y, z;
    x = read();
    y = read();
    z = read();
    st.clear();
    int l = lca(x, y);
    xkth(x, d[x] - d[l]);
    xkth(y, d[y] - d[l]);
    printf("%d ", min(z, (int)st.size()));
    for (set<int>::iterator j = st.begin(); j != st.end(); j++) {
      printf("%d ", (*j));
      z--;
      if (z == 0) break;
    }
    puts("");
  }
}