#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;
typedef pair<ll,ll> ii;
typedef vector<ll> vi;
typedef vector< ii > vii;

#define INF 0x3F3F3F3F
#define LINF 0x3F3F3F3F3F3F3F3FLL
#define pb push_back
#define mp make_pair
#define pq priority_queue
#define LSONE(s) ((s)&(-s)) //LASTBIT
#define DEG_to_RAD(X)   (X * PI / 180)
#define F first
#define S second

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

//////////////////////
int dx[] = {1,-1,0,0};
int dy[] = {0,0,-1,1};	
//////////////////////

const int N = 100011;
const int M = 18;

int n,k;
int a[N],b[N];
vi g[N];


int lca[M][N];
int depth[N];

void dfs( int x = 1, int ult = 0, int prof = 0 )
{
	depth[x] = prof;
	lca[0][x] = ult;
	for(int i=0;i<(int)g[x].size();++i)
	{
		int y = g[x][i];
		if( y == ult ) continue;
		dfs(y,x,prof+1);
	}
}

void process()
{
	for(int i=1;i<M;++i) for(int j=1;j<=n;++j) lca[i][j] = lca[i-1][lca[i-1][j]];
}


int get_anc( int a, int b )
{
	int d = depth[a]-depth[b];
	for(int i=0;i<M;++i) if( d&(1<<i) ) a = lca[i][a];
	if( a==b ) return a;
	for(int i=M-1;i>=0;--i) if( lca[i][a] != lca[i][b] ) a = lca[i][a], b = lca[i][b];
	return lca[0][a];
}

int get_dist( int a, int b )
{
	if( a == b ) return 0;
	if( depth[a] < depth[b] ) swap(a,b);
	int l = get_anc(a,b);
	return depth[a]+depth[b]-2*depth[l];
}

int cost[1010][1010];


int flow[610][610];
int p[610], vis[610];
vi graph[610];
int s,t;



bool bfs()
{
	memset(vis,0,sizeof vis);
	memset(p,-1,sizeof p);
	queue<int>q; q.push(s);
	vis[s] = 1;
	while(!q.empty())
	{
		int x = q.front(); q.pop();
		for(int i=0;i<(int)graph[x].size();++i)
		{
			int y = graph[x][i];
			if( vis[y] ) continue;
			if( flow[x][y] == 0 ) continue;
			p[y] = x;
			q.push(y);
			vis[y] = 1;
			if( y == t ) return true;
		}
	}
	return false;
}

int mf;

void solve()
{
	mf = 0;
	while( bfs() )
	{
		int id = t;
		while( p[id] != -1 ) 
		{
			flow[p[id]][id]--;
			flow[id][p[id]]++;
			id = p[id];
		}
		mf++;
	}
}

bool test( int top )
{
	memset(flow,0,sizeof flow);
	for(int i=0;i<610;++i) graph[i].clear();

	s = 605, t = 606;

	for(int i=0;i<k;++i)
	{
		graph[s].pb(i*2);
		graph[i*2+1].pb(t);
		flow[s][i*2] = 1;
		flow[i*2+1][t] = 1;
	}

	for(int i=0;i<k;++i)
	{
		for(int j=0;j<k;++j)
		{
			if( cost[i][j] <= top )
			{
				graph[i*2].pb(2*j+1);
				graph[2*j+1].pb(i*2);
				flow[i*2][2*j+1] = 1;
			}
		}
	}
	solve();
	return mf == k;
}


int main()
{
	//ios::sync_with_stdio(0);
	while(scanf("%d %d",&n,&k)!=EOF)
	{
		for(int i=0;i<n;++i) g[i].clear();
		memset(lca,0,sizeof lca);

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

		dfs();
		process();

		for(int i=0;i<k;++i)
		{
			for(int j=0;j<k;++j)
			{
				cost[i][j] = get_dist(a[i],b[j]);
//				debug("%d ",cost[i][j]);
			}
//			debug("\n");
		}


	//	debug("%d\n",test(0));

		int lo = 0, hi = 10040;

		while( hi-lo > 1 )
		{
			int mid = (lo+hi)>>1;
			if( !test(mid) ) lo = mid;
			else hi = mid;
		}
		int resp = INF;
		if( test(hi) ) resp = min( resp, hi );
		if( test(lo) ) resp = min( resp, lo );

		printf("%d\n",resp);
	}
	return 0;
}