int T
cin >> T
while (T--)
//
//
using namespace std
typedef long long LL
typedef unsigned long long ULL
typedef pair<int, int> PII
typedef pair<LL, LL> PLL
//
//
inline int rd()
{
int f = 1, x = 0
char c = getchar()
while (c < '0' || '9' < c)
{
if (c == '-')
f = -1
c = getchar()
}
while ('0' <= c && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar()
return f * x
}
// 常数定义
const double eps = 1e-6
const double PI = acos(-1.0)
const int INF = 0x3f3f3f3f
const int N = 1e5 + 10, M = 2 * N
int h[N], e[M], ne[M], idx
bool affected[N]
int dist1[N], dist2[N]
int n, m, d
int ans
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++
}
void dfs1(int u, int father)
{
if(affected[u])dist1[u] = 0
int &d1 = dist1[u], &d2 = dist2[u]
for (int i = h[u]
{
int v = e[i]
if (v == father)
continue
dfs1(v, u)
int d = dist1[v] + 1
// debug1(d)
if(dist1[v] == -1)continue
if (d >= d1)
d2 = d1, d1 = d
else if (d > d2)
d2 = d
}
// return dist
}
void dfs2(int u, int fa,int preLen)
{
if(max(dist1[u],preLen) <= d)ans ++
// debug2(u,max(dist1[u],preLen))
for (int i = h[u]
{
int v = e[i]
if (v == fa)
continue
int Len = preLen
if(dist1[v] >= 0)Len = (dist1[v] == dist1[u]-1)?max(Len,dist2[u])+1:max(Len,dist1[u])+1
else Len = max(Len,dist1[u]) + 1
dfs2(v, u, Len)
}
}
void solve()
{
memset(h, -1, sizeof h)
memset(dist1,-0x3f,sizeof dist1)
memset(dist2,-0x3f,sizeof dist2)
// memset(f, -1, sizeof f)
cin >> n >> m >> d
for (int i = 0
{
int t
cin >> t
affected[t] = 1
}
for (int i = 0
{
int x, y
cin >> x >> y
add(x, y)
add(y, x)
}
dfs1(1, -1)
dfs2(1, -1, -1044266559)
// for(int i = 1
cout << ans << endl
}
signed main()
{
ios::sync_with_stdio(false)
cin.tie(0)
cout.tie(0)
// caseT
solve()
return 0
}
/*
*/