#include <iostream> #include<vector> #include<queue> #include<map> #include<string> #include<cstring> #include<iomanip> #include<algorithm> #include<cmath> #include<set> #include<stack> #include<sstream> using namespace std; vector<vector<int> > g(1024); vector<int> distForFastestDrop(1024, 1000000000); void bfs(int source){ vector<bool> visited(1024); queue<pair<int, int> > q; vector<int> dist(1024, 1000000000); q.push(make_pair(source, 0)); visited[source] = true; while(!q.empty()){ pair<int, int> f = q.front(); int v = f.first; int d = f.second; dist[v] = min(dist[v], d); // cout << v << " " << d << endl; q.pop(); for(int i = 0; i < g[v].size(); i++){ int inV = g[v][i]; if(!visited[inV]){ q.push(make_pair(inV, d+1)); visited[inV] = true; } } } for(int i = 0; i < 1024; i++){ distForFastestDrop[i] = min(distForFastestDrop[i], dist[i]); } } int main() { int n, k; cin >> n >> k; vector<int> specs(k); vector<int> servers(k); for(int i = 0; i < k; i++){ cin >> specs[i]; } for(int i = 0; i < k; i++){ cin >> servers[i]; } for(int i = 0; i < n -1; i++){ int x,y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } for(int i = 0; i < specs.size(); i++){ //cout <<"sp " << specs[i] << endl; bfs(specs[i]); } int max1 = -1; for(int i = 0; i < servers.size(); i++){ // cout << distForFastestDrop[servers[i]] << endl; max1 = max(max1, distForFastestDrop[servers[i]]); } cout << max1 << endl; return 0; }