#include <bits/stdc++.h>

#define maxn 10100
#define inf 0x3F3F3F3F
#define linf 0x3F3F3F3F3F3F3F3FLL
#define eps 1e-9
#define pb push_back
#define mp make_pair

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef priority_queue<pii, vii, greater<pii> > pq;

#ifdef ONLINE_JUDGE
#define debug(args...)
#else
#define debug(args...) fprintf(stderr,args)
#endif

int n, k;
int a[333], b[333];
int server[maxn];
vi g[maxn];
int dist[700][700];
int flow[700][700];
int aux[700][700];
vi g2[maxn];
int pai[700];
int lo, hi, mid;
int sink, source = 0;

void dfs(int x, int pai, int d, int kl)
{
	if(server[x])
	{
		dist[kl+1][server[x]+1+k] = d;
		dist[server[x]+1+k][kl+1] = d;
		hi = max(hi, d);
	}
	for(int i = 0; i < (int)g[x].size(); ++i)
	{
		int y = g[x][i];
		if(y == pai) continue;
		dfs(y, x, d+1, kl);
	}
}

bool bfs()
{
	memset(pai, -1, sizeof pai);
	queue<int> q;
	q.push(source);
	pai[source] = source;
	int x, y;
	while(!q.empty())
	{
		x = q.front();
		q.pop();
		for(int i = 0; i < (int)g2[x].size(); ++i)
		{
			y = g2[x][i];
			if(pai[y] == -1 && dist[x][y] <= mid && aux[x][y])
			{
				pai[y] = x;
				q.push(y);
			}
		}
	}
	return pai[sink] != -1;
}

int ford()
{
	int fluxo = 0, x;
	memcpy(aux, flow, sizeof flow);
	while(bfs())
	{
		fluxo++;
		x = sink;
		while(x != source)
		{
			aux[pai[x]][x]--;
			aux[x][pai[x]]++;
			x = pai[x];
		}
	}
	return fluxo;
}

int main()
{
	int x, y;
	scanf("%d %d", &n, &k);
	sink = 2*k+1;
	for(int i = 0; i < k; ++i)
	{
		scanf("%d", &a[i]);
	}

	for(int i = 0; i < k; ++i)
	{
		scanf("%d", &b[i]);
		server[b[i]] = i;
	}

	for(int i = 0; i < n-1; ++i)
	{
		scanf("%d %d", &x, &y);
		g[x].pb(y);
		g[y].pb(x);
	}

	for(int i = 0; i < k; ++i)
	{
		g2[source].pb(i+1);
		flow[source][i+1] = 1;

		g2[i+k+1].pb(sink);
		flow[i+k+1][sink] = 1;

		for(int j = 0; j < k; ++j)
		{
			g2[i+1].pb(j+1+k);
			g2[j+1+k].pb(i+1);
			flow[i+1][j+1+k] = 1;
		}
	}

	for(int i = 0; i < k; ++i)
	{
		dfs(a[i], -1, 0, i);
	}

	while(lo < hi-1)
	{
		mid = (lo+hi)/2;
		x = ford();

		if(x == k)
		{
			hi = mid;
		}
		else
		{
			lo = mid;
		}
	}
	printf("%d\n", hi);

	return 0;
}