#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n,D;
vector<int> G[maxn];
int d1[maxn]; // d1[x] 夜刀 最深需要访问的节点深度
int d2[maxn]; // d2[x] 黑角 最深需要访问的节点深度
int d[maxn]; // 每个节点的深度
int k1[maxn]; // 夜刀 需要访问的点
int k2[maxn]; // 黑角 需要访问的点
int ans;
void dfs(int x,int fa){
if(k1[x]) d1[x] = d[x];
if(k2[x]) d2[x] = d[x];
for(int i = 0; i< G[x].size();i++){
int u = G[x][i];
if(u == fa) continue;
d[u] = d[x] + 1;
dfs(u,x);
d1[x] = max(d1[x],d1[u]);
d2[x] = max(d2[x],d2[u]);
}
if(!d1[x] && d2[x] - d[x] <= D - 1){ // 夜刀不需要去x这个点
ans -= 2;
}
if(!d2[x] && d1[x] - d[x] <= D - 1){ // 黑角不需要去x这个点
ans -= 2;
}
return;
}
int main(){
cin>>n>>D;
ans = 4 * (n - 1); // 所有节点的都访问的总边数
n--;
while(n--){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
int a;
cin>>a;
while(a--){
int w;
cin>>w;
k1[w] = 1;
}
cin>>a;
while(a--){
int w;
cin>>w;
k2[w] = 1;
}
d[1] = 1;
dfs(1,0); // 1 号为根节点
cout<<ans;
}