#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
#define MAXN 400010
int readint()
{
int x = 0, c;
while (!isdigit(c = getchar()));
do
x = x * 10 + c -'0';
while (isdigit(c = getchar()));
return x;
}
int n, k;
bool fruit[MAXN];
vector<int> edge[MAXN];
bool vised[MAXN];
int fa[MAXN];
void dfs(int now)
{
vised[now] = 1;
int sz = (int)edge[now].size();
for (int i = 0; i < sz; i++)
{
int v = edge[now][i];
if (!vised[v])
{
fa[v] = now;
dfs(v);
}
}
}
int s[MAXN];
void count(int now, int k)
{
int sz = (int)edge[now].size();
for (int i = 0; i < sz; i++)
{
int v = edge[now][i];
if (fa[v] == now)
count(v, k);
}
if (fruit[now])
{
s[now] = 1;
for (int i = 0; i < sz; i++)
{
int v = edge[now][i];
if (fa[v] == now && s[v] < 0)
s[now] += -s[v];
}
}
else
{
int ms = n + 1, delta = 1;
for (int i = 0; i < sz; i++)
{
int v = edge[now][i];
if (fa[v] == now && s[v] > 0 && s[v] < ms)
ms = s[v];
if (fa[v] == now && s[v] < 0)
delta += -s[v];
}
if (ms + delta <= k)
s[now] = ms + delta;
else
s[now] = -delta;
}
}
bool check(int mid)
{
memset(s, 0, sizeof(s));
count(1, mid);
for (int i = 1; i <= n; i++)
if (abs(s[i]) > mid)
return false;
if (s[1] < 0)
return false;
return true;
}
int main()
{
freopen("deep.in", "r", stdin);
freopen("deep.out", "w", stdout);
n = readint();
k = readint();
for (int i = 1; i < n; i++)
{
int u = readint();
int v = readint();
edge[u].push_back(v);
edge[v].push_back(u);
}
for (int i = 0; i < k; i++)
fruit[readint()] = 1;
dfs(1);
int l = 1, r = n;
while (l < r)
{
int mid = (l + r) / 2;
if (check(mid))
r = mid;
else
l = mid + 1;
}
printf("%d\n", l);
return 0;
}