#include #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 pii; typedef vector vi; typedef vector vii; typedef priority_queue > 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 = 1, hi, mid; int sink, source = 0; void dfs(int x, int pai, int d, int k) { if(server[x]) { dist[k+1][server[x]+1] = d; dist[server[x]+1][k+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, k); } } bool bfs() { memset(pai, -1, sizeof pai); queue 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); } hi++; int ans = inf; while(lo < hi-1) { mid = (lo+hi)/2; if(ford() == k) { ans = min(ans, mid); hi = mid; } else { lo = mid+1; } } printf("%d\n", ans); return 0; }