#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; }