#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#define pb push_back
#define Nmax 10004
#define INF (int)1e9

using namespace std;

int n, k;
struct Ceva{
	int nod;
	int spec;
};
vector<int> A[Nmax];
set<int> finalPos;
int initPos[Nmax];
//int finalPos[Nmax];
int d[Nmax];
int assigned[Nmax];
queue<Ceva> 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;
}