#include #include #include #include using namespace std; const int NMAX = 602; const int AMAX = 10000; const int INF = 2000000000; int a[NMAX + 1], b[NMAX + 1]; bool vz[AMAX + 1]; int rad, ds[NMAX + 1][AMAX + 1]; vector gr[AMAX + 1]; int cost[NMAX + 1][NMAX + 1]; int k, lim, sol; vector v1[NMAX + 1], v2[NMAX + 1];; void dfs (int nod) { vz[nod] = true; for (int i = 0; i < gr[nod].size (); ++i) { int fiu = gr[nod][i]; if (!vz[fiu]) { ds[rad][fiu] = ds[rad][nod] + 1; dfs (fiu); } } } int f1[NMAX],f2[NMAX],viz[NMAX]; bool cupl(int nod) { if(viz[nod]) return false; viz[nod]=1; int x; for(int i=0;i lim) continue; if(!f2[x]) { f1[nod]=x; f2[x]=nod; ++sol; return true; } } for(int i=0;i lim) continue; if(cupl(f2[x])) { f1[nod]=x; f2[x]=nod; return true; } } return false; } bool verific (int med) { int lim = med; sol = 0; bool ok = true; while(ok) { ok=false; memset(viz,0,sizeof(viz)); for(int i=1;i<=k;++i) if(!f1[i]) ok|=cupl(i); } return sol == k; } int main () { //freopen ("kSpecialists.in", "r", stdin); //freopen ("kSpecialists.out", "w", stdout); int n, x, y; scanf ("%d%d", &n, &k); for (int i = 1; i <= k; ++i) scanf ("%d", &a[i]); for (int i = 1; i <= k; ++i) scanf ("%d", &b[i]); for (int i = 1; i < n; ++i) { scanf ("%d%d", &x, &y); gr[x].push_back (y); gr[y].push_back (x); } for (rad = 1; rad <= k; ++rad, memset (viz, 0, sizeof (viz))) dfs (a[rad]); for (int i = 1; i <= k; ++i) for (int j = 1; j <= k; ++j) { int x = i, y = j; cost[x][y] = ds[i][b[j]]; v1[x].push_back (y); v2[y].push_back (x); } int sol, st = 1, dr = INF; while (st <= dr) { int med = (st + dr) >> 1; if (verific (med)) { sol = med; dr = med - 1; }else st = med + 1; } printf ("%d\n", sol); return 0; }