#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;

vector <vector <int> > Map;

int N, K, in, sf, x, y, elem, need[10002], T[10002], Length[10002], usd[302];

struct spc {
    int sp, v;
}coada[100002];

int main() {
    #ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    #endif // ONLINE_JUDGE

    cin >> N >> K;

    Map.resize(10002);

    for(int i = 1; i <= K; ++i) {
        cin >> x;

        T[x] = 1;
        coada[++sf].v = x;
        coada[sf].sp = i;
    }

    elem = K;

    for(int i = 1; i <= K; ++i) {
        cin >> x;

        need[x] = 1;

        if(T[x]) {
            need[x] = 0;
            --elem;
        }
    }

    for(int i = 1; i < N; ++i) {
        cin >> x >> y;

        Map[y].push_back(x);
        Map[x].push_back(y);
        ++Length[x];
        ++Length[y];
    }

    in = 1;

    int mx = 0;

    while(in <= sf && elem) {
        for(int i = 0;elem && i < Length[coada[in].v]; ++i) {
            if(usd[coada[in].sp] == 0) {
                T[Map[coada[in].v][i]] = T[coada[in].v] + 1;
                if(need[Map[coada[in].v][i]] == 1) {
                    need[Map[coada[in].v][i]] = 0;
                    --elem;
                    mx = max(mx, T[Map[coada[in].v][i]]);
                    usd[coada[in].sp] = 1;
                }

                coada[++sf].v = Map[coada[in].v][i];
                coada[sf].sp = coada[in].sp;
            }
        }

        ++in;
    }

    cout << max(0, mx - 1) << '\n';

    return 0;
}