#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define mp make_pair #define pb push_back #define ff first #define ss second #define int64 unsigned long long vector v[1001]; int lvl[1001]; int T[11][1001]; int dist[301][301]; int server[301]; int specialist[301]; bool used[1001]; int n; void dfs(int s,int father,int Level){ lvl[s] = Level; T[0][s] = father; for(int i = 0; i < v[s].size(); i++) if(v[s][i] != father) dfs(v[s][i],s,Level+1); } void build_lca(){ for(int k = 1; (1 << k) <= n; k++) for(int i = 1; i <= n; i++) T[k][i] = T[k-1][T[k-1][i]]; } int lca(int x,int y){ if(lvl[x] < lvl[y]){ swap(x,y); } int log1,log2; for(log1 = 1; (1 << log1) < lvl[x]; log1++); for(log2 = 1; (1 << log2) < lvl[y]; log2++); for(int k = log1; k >= 0; k--) if(lvl[x] - (1 << k) >= lvl[y]) x = T[k][x]; if(x == y) return x; for(int k = log2; k >= 0; k--) if(T[k][x] > 0 && T[k][x] != T[k][y]){ x = T[k][x]; y = T[k][y]; } return T[0][x]; } int main(){ ios_base::sync_with_stdio(false); freopen("input.in", "r", stdin); freopen("input.out", "w", stdout); int k; scanf("%d%d",&n,&k); for(int i = 1; i <= k; i++) scanf("%d",&specialist[i]); for(int i = 1; i <= k; i++) scanf("%d",&server[i]); for(int i = 1; i < n; i++){ int x,y; scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } dfs(1,0,0); build_lca(); int sec = 0; for(int i = 1; i <= k; i++){ int best = 0, dis =0x3f3f3f3f; for(int j = 1; j <= k; j++){ if(used[server[j]]) continue; int LCA = lca(specialist[i],server[j]); int newd = lvl[specialist[i]] - lvl[LCA] + lvl[server[j]] - lvl[LCA]; if(newd < dis){ dis = newd; best = j; } } used[server[best]] = 1; sec = max(sec,dis); } printf("%d",sec); }