#include #include #include #include #include #define pb push_back #define Nmax 10004 #define INF (int)1e9 using namespace std; int n, k; struct Ceva{ int nod; int spec; }; vector A[Nmax]; set finalPos; int initPos[Nmax]; //int finalPos[Nmax]; int d[Nmax]; int assigned[Nmax]; queue Q; int main() { //freopen ("fis.in", "r", stdin); //freopen ("fis.out", "w", stdout); scanf ("%d %d\n", &n, &k); for (int i = 1; i <= n; i++) d[i] = INF, assigned[i] = -1; for (int i = 1; i <= k; i++) { Ceva var; scanf ("%d ", &initPos[i]); var.nod = initPos[i]; var.spec = i; Q.push(var); d[initPos[i]] = 0; } for (int i = 1; i <= k; i++) { int x; scanf ("%d ", &x); finalPos.insert(x); } for (int i = 1; i <= k; i++) { if (finalPos.find(initPos[i]) != finalPos.end()) { assigned[i] = 1; } } for (int i = 1; i < n; i++) { int x, y; scanf ("%d %d\n", &x, &y); A[x].pb(y); A[y].pb(x); } while (!Q.empty()) { Ceva x = Q.front(); Q.pop(); for (int i = 0; i < A[x.nod].size(); i++) { int y = A[x.nod][i]; if (d[y] >= d[x.nod] + 1 && finalPos.find(y) == finalPos.end()) { d[y] = d[x.nod] + 1; Ceva var; var.nod = y; var.spec = x.spec; Q.push(var); continue; } if (d[y] >= d[x.nod] + 1 && finalPos.find(y) != finalPos.end() && assigned[x.spec] == -1) { d[y] = d[x.nod] + 1; assigned[x.spec] = d[y]; } if (d[y] < d[x.nod] + 1 && finalPos.find(y) != finalPos.end() && assigned[x.spec] == -1) { d[y] = d[x.nod] + 1; } } } int sol = -1; for (int i = 1; i <= k; i++) { sol = max (sol, assigned[i]); } printf ("%d\n", sol); return 0; }