#include<bits/stdc++.h>
const int maxn=1e5+10;
using namespace std;
struct node{
int x,d;
};
vector<int>mp[maxn];
int ty[maxn],vis[maxn],p[maxn];
int ans1=0,ans2=0;
int point1=0,point2=0;
void bfs(int x){
queue<node>q;
q.push({x,0});
vis[x]=1;
while(!q.empty()){
// cout<<"qwe"<<endl;
node k=q.front();q.pop();
if(ty[k.x]){
if(k.d>ans1){
ans1=k.d;point1=k.x;
}
// ans1=max(ans1,k.d);
}
// cout<<k.x<<endl;
for(int i=0;i<mp[k.x].size();i++){
int j=mp[k.x][i];
if(vis[j])continue;vis[j]=1;
q.push({j,k.d+1});
}
}
memset(vis,0,sizeof(vis));
q.push({point1,0});vis[point1]=1;
while(!q.empty()){
node k=q.front();q.pop();
if(ty[k.x]){
if(k.d>ans2){
ans2=k.d;point2=k.x;
}
}
for(int i=0;i<mp[k.x].size();i++){
int j=mp[k.x][i];
if(vis[j])continue;vis[j]=1;
q.push({j,k.d+1});
}
}
}
int main(){
int n,k;scanf("%d%d",&n,&k);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
mp[u].push_back(v);
mp[v].push_back(u);
}
for(int i=1;i<=k;i++){
scanf("%d",&p[i]);
ty[p[i]]=1;
}
// cout<<"qwe"<<endl;
bfs(p[1]);
// cout<<point1<<endl;
// bfs(point1)
// cout<<point1<<" "<<point2<<endl;
int ans=ans2/2;
if(ans2%2)ans++;
printf("%d\n",ans);
}