#include <iostream>
#include <vector>
#include <cstring>
#include <bitset>
#include <set>
#include <deque>
#include <queue>
#include <iomanip>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#include <sstream>
#include <functional>
#include <utility>
#include <cstdio>

using namespace std;

#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define int64 unsigned long long

vector<int> v[1001];
int lvl[1001];
int T[11][1001];
int dist[301][301];
int server[301];
int specialist[301];
bool used[1001];
int n;

void dfs(int s,int father,int Level){
    lvl[s] = Level;
    T[0][s] = father;
    for(int i = 0; i < v[s].size(); i++)
        if(v[s][i] != father)
            dfs(v[s][i],s,Level+1);
}

void build_lca(){
    for(int k = 1; (1 << k) <= n; k++)
        for(int i = 1; i <= n; i++)
            T[k][i] = T[k-1][T[k-1][i]];
}

int lca(int x,int y){
    if(lvl[x] < lvl[y]){
        swap(x,y);
    }
    int log1,log2;
    for(log1 = 1; (1 << log1) < lvl[x]; log1++);
    for(log2 = 1; (1 << log2) < lvl[y]; log2++);
    for(int k = log1; k >= 0; k--)
        if(lvl[x] - (1 << k) >= lvl[y]) x = T[k][x];
    if(x == y) return x;
    for(int k = log2; k >= 0; k--)
        if(T[k][x] > 0 && T[k][x] != T[k][y]){
            x = T[k][x];
            y = T[k][y];
        }
    return T[0][x];
}

int main(){

   ios_base::sync_with_stdio(false);

    freopen("input.in", "r", stdin);
    freopen("input.out", "w", stdout);

    int k;
    scanf("%d%d",&n,&k);
    for(int i = 1; i <= k; i++)
        scanf("%d",&specialist[i]);
    for(int i = 1; i <= k; i++)
        scanf("%d",&server[i]);

    for(int i = 1; i < n; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }

    dfs(1,0,0);
    build_lca();

    int sec = 0;

    for(int i = 1; i <= k; i++){
        int best = 0, dis =0x3f3f3f3f;
        for(int j = 1; j <= k; j++){
            if(used[server[j]]) continue;
            int LCA = lca(specialist[i],server[j]);
            int newd = lvl[specialist[i]] - lvl[LCA] + lvl[server[j]] - lvl[LCA];
            if(newd < dis){
                dis = newd;
                best = j;
            }
        }
        used[server[best]] = 1;
        sec = max(sec,dis);
    }

    printf("%d",sec);

}