#include <bits/stdc++.h>
using namespace std;
vector<int>a[1000005];
int id[1000005];
bool c[1000005],b[1000005];
long long f[1000005][3];
/*
对于与黑色点相邻的灰色点:
0:根节点在之后被父节点染成白色
1:根节点在之后被子节点染成白色
2:根节点初始时染成白色
为了尽量简化问题,尝试把另外两种情况统一到这种DP状态中,为此使用更通用的描述,使用"覆盖"的定义:
0:根节点未能被覆盖
1:根节点已经被覆盖
2:根节点染成白色
*/
void dfs(int n1,int fa)
{
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa)
{
dfs(a[n1][i],n1);
}
}
if(b[n1]==false)
{
f[n1][2]=1;
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa)
{
f[n1][2]+=min(f[a[n1][i]][0],min(f[a[n1][i]][1],f[a[n1][i]][2]));
}
}
}
else
{
f[n1][2]=INT_MAX;
}
f[n1][0]=0;
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa)
{
f[n1][0]+=min(f[a[n1][i]][1],f[a[n1][i]][2]);
}
}
long long minn=INT_MAX;
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa)
{
minn=min(minn,f[a[n1][i]][2]-f[a[n1][i]][1]);
}
}
if(minn<0)
{
minn=0;
}
f[n1][1]=f[n1][0]+minn;
if(c[n1]==false)
{
f[n1][1]=min(f[n1][0],f[n1][1]);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++)
{
cin>>id[i];
b[id[i]]=true;
}
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
for(int i=1;i<=k;i++)
{
for(int j=0;j<a[id[i]].size();j++)
{
c[a[id[i]][j]]=true;
}
}
for(int i=1;i<=k;i++)
{
c[id[i]]=false;
}
dfs(1,0);
cout<<min(f[1][1],f[1][2])<<endl;
return 0;
}