#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define dbg(x) (cout<<#x<<" = "<<(x)<<'\n') #ifdef HOME const string inputFile = "input.txt"; const string outputFile = "output.txt"; #else const string problemName = ""; const string inputFile = problemName + ".in"; const string outputFile = problemName + ".out"; #endif typedef long long int lld; typedef pair PII; typedef pair PIL; typedef pair PLI; typedef pair PLL; const int INF = (1LL << 31) - 1; const lld LINF = (1LL << 62) - 1; const int dx[] = {1, 0, -1, 0, 1, -1, 1, -1}; const int dy[] = {0, 1, 0, -1, 1, -1, -1, 1}; const int MOD = (int)(1e9) + 7; const int NMAX = 10000 + 5; const int KMAX = 300 + 5; int N, K, sol; vector V[NMAX]; PII RMQ[16][2 * NMAX]; int euler[2 * NMAX], cnt; int first[NMAX]; int lvl[NMAX]; int dad[NMAX]; int A[NMAX]; int B[NMAX]; int VAL; vector AA[NMAX]; bitset viz; int P[NMAX]; int Q[NMAX]; void dfs(int x) { euler[++cnt] = x; first[x] = cnt; for(auto y : V[x]) { if(y == dad[x]) continue; lvl[y] = lvl[x] + 1; dad[y] = x; dfs(y); euler[++cnt] = x; } } void build() { int i, j, p; for(i = 1; i <= cnt; i++) RMQ[0][i] = make_pair(lvl[euler[i]], euler[i]); for(i = 1, p = 2; 1 + p / 2 <= cnt; i++, p *= 2) for(j = 1; j + p / 2 <= cnt; j++) RMQ[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + p / 2]); } int query(int x, int y) { int d = y - x + 1; int i = log2(d + 0.5); int p = (1 << i); return min(RMQ[i][x], RMQ[i][y - p + 1]).second; } int lca(int x, int y) { x = first[x]; y = first[y]; if(x > y) swap(x, y); return query(x, y); } int pair_up(int x) { if(viz[x]) return 0; viz[x] = 1; for(auto y : AA[x]) { if(y.second <= VAL) { if((!Q[y.first]) || (pair_up(Q[y.first]))) { P[x] = y.first; Q[y.first] = x; return 1; } } } return 0; } int main() { int i, j, x, y, z; freopen(inputFile.c_str(), "r", stdin); freopen(outputFile.c_str(), "w", stdout); scanf("%d%d", &N, &K); for(i = 1; i <= K; i++) scanf("%d", &A[i]); for(i = 1; i <= K; i++) scanf("%d", &B[i]); for(i = 2; i <= N; i++) { scanf("%d%d", &x, &y); V[x].push_back(y); V[y].push_back(x); } dfs(1); build(); for(i = 1; i <= K; i++) for(j = 1; j <= K; j++) { x = A[i]; y = B[j]; z = lca(x, y); AA[i].push_back(make_pair(j, lvl[x] + lvl[y] - 2 * lvl[z])); } int lo = 0; int hi = NMAX; int ans, ok; sol = NMAX; while(lo <= hi) { VAL = (lo + hi) / 2; ans = 0; memset(P, 0, sizeof(P)); memset(Q, 0, sizeof(Q)); do { ok = 0; viz = 0; for(i = 1; i <= K; i++) if(!P[i]) ok |= pair_up(i); } while(ok); for(i = 1; i <= K; i++) if(P[i]) ans++; if(ans == K) { hi = VAL - 1; sol = VAL; } else lo = VAL + 1; } printf("%d\n", sol); return 0; }