#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 100005;
const int LG = 17;
vector<int> adj[MAX];
struct node
{
	int a[11];
	node()
	{
		memset(a, 63, sizeof(a));
	}
	void insert(int val)
	{
		a[10] = val;
		sort(a, a + 11);
	}
} vals[LG][MAX];
node merge(node x, node y)
{
	node ans = x;
	for (int i = 0; i < 11; i++)
		ans.insert(y.a[i]);
	return ans;
}
int par[LG][MAX], d[MAX];
void dfs(int p, int v)
{
	par[0][v] = p;
	for (int i = 1; i < LG; i++)
	{
		par[i][v] = par[i - 1][par[i - 1][v]];
		vals[i][v] = merge(vals[i - 1][v], vals[i - 1][par[i - 1][v]]);
	}
	for (int i = 0; i < (int)adj[v].size(); i++)
	{
		int u = adj[v][i];
		if (u != p)
		{
			d[u] = d[v] + 1;
			dfs(v, u);
		}
	}
}
int get_parent(int v, int k)
{
	for (int i = 0; i < LG; i++)
		if ((1 << i) & k)
			v = par[i][v];
	return v;
}
int lca(int u, int v)
{
	if (d[u] < d[v])
		swap(u, v);
	u = get_parent(u, d[u] - d[v]);
	if (u == v)
		return u;
	for (int i = LG - 1; i >= 0; i--)
		if (par[i][u] != par[i][v])
		{
			u = par[i][u];
			v = par[i][v];
		}
	return par[0][v];
}
node get(int v, int k)
{
	node ans;
	for (int i = 0; i < LG; i++)
		if ((1 << i) & k)
		{
			ans = merge(ans, vals[i][v]);
			v = par[i][v];
		}
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m, q;
	cin >> n >> m >> q;
	for (int i = 0; i < n - 1; i++)
	{
		int u, v;
		cin >> u >> v;
		u--;
		v--;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for (int i = 0; i < m; i++)
	{
		int c;
		cin >> c;
		c--;
		vals[0][c].insert(i);
	}
	dfs(0, 0);
	while (q--)
	{
		int u, v, k;
		cin >> u >> v >> k;
		u--;
		v--;
		int p = lca(u, v);
		node x = get(u, d[u] - d[p]);
		node y = get(v, d[v] - d[p] + 1);
		node ans = merge(x, y);
		int tmp = 0;
		while (tmp < k && ans.a[tmp] < m)
			tmp++;
		k = tmp;
		cout << k;
		for (int i = 0; i < k; i++)
			cout << " " << ans.a[i] + 1;
		cout << "\n";
	}
	return 0;
}
