#include #include #include #include #include #include #include #include #include #include #define in cin #define out cout #define abs(x) ((x>0)?(x):(-(x))) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define DOWNFOR(i, a, b) for(int i = a; i >= b; --i) #define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i) using namespace std; typedef long long ll; const int Nmax = 10001; vector G[Nmax],B[301]; struct ln{ int x,y,d; ln(){} ln(int _x,int _y,int _d){x=_x,y=_y,d=_d;} }; struct cmp{ inline bool operator () (const ln &a,const ln &b){ return a.d E; int a[301],b[301]; int v[301][301]; int N,K; int m[Nmax]; void dfs(int x,int l){ m[x]=l; FOREACH(t,G[x]){ if(!m[*t]) dfs(*t,l+1); } } int l[301],r[301]; int addpath(int x){ if(m[x]) return 0; m[x]=1; FOREACH(t,B[x]){ if(!r[*t] || addpath(r[*t])){ l[x]=*t; r[*t]=x; return 1; } } return 0; } int res(int val){ FOR(i,1,K) B[i].clear(); FOR(i,0,val){ if( E[i].d ) B[ E[i].x ].push_back( E[i].y ); } FOR(i,1,K) l[i]=r[i]=0; int p=1; while(p){ p=0;FOR(i,1,K) m[i]=0; FOR(i,1,K) if(!l[i]) p |= addpath(i); } int ok=1; FOR(i,1,K) if(!l[i]) ok=0; return ok; } int bs(){ int i=-1,pas=(1<<17); while(pas){ if(i+pas>=1; } return i+1; } int main(){ #ifndef ONLINE_JUDGE ifstream in("test.in"); ofstream out("test.out"); #endif in>>N>>K; FOR(i,1,K) in>>a[i]; FOR(i,1,K) in>>b[i]; FOR(i,1,N-1){ int x,y; in>>x>>y; G[x].push_back(y); G[y].push_back(x); } FOR(i,1,K){ FOR(j,1,N) m[j]=0; dfs(a[i],1); FOR(j,1,K) v[i][j]=m[b[j]]-1; } FOR(i,1,K) FOR(j,1,K) E.push_back( ln(i,j,v[i][j]) ); sort(E.begin(),E.end(),cmp()); out<< E[bs()].d <<'\n'; return 0; }