#include #include #include using namespace std; vector > Map; int N, K, in, sf, x, y, elem, need[10002], T[10002], Length[10002], usd[302]; struct spc { int sp, v; }coada[100002]; int main() { #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); #endif // ONLINE_JUDGE cin >> N >> K; Map.resize(10002); for(int i = 1; i <= K; ++i) { cin >> x; T[x] = 1; coada[++sf].v = x; coada[sf].sp = i; } elem = K; for(int i = 1; i <= K; ++i) { cin >> x; need[x] = 1; if(T[x]) { need[x] = 0; --elem; } } for(int i = 1; i < N; ++i) { cin >> x >> y; Map[y].push_back(x); Map[x].push_back(y); ++Length[x]; ++Length[y]; } in = 1; int mx = 0; while(in <= sf && elem) { for(int i = 0;elem && i < Length[coada[in].v]; ++i) { if(usd[coada[in].sp] == 0) { T[Map[coada[in].v][i]] = T[coada[in].v] + 1; if(need[Map[coada[in].v][i]] == 1) { need[Map[coada[in].v][i]] = 0; --elem; mx = max(mx, T[Map[coada[in].v][i]]); usd[coada[in].sp] = 1; } coada[++sf].v = Map[coada[in].v][i]; coada[sf].sp = coada[in].sp; } } ++in; } cout << max(0, mx - 1) << '\n'; return 0; }