#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>

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 <int> gr[AMAX + 1];

int cost[NMAX + 1][NMAX + 1];

int k, lim, sol;

vector <int> 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<v1[nod].size();++i)
    {
        x=v1[nod][i];
        if ((cost[nod][x]) > lim) continue;
        if(!f2[x])
        {
            f1[nod]=x;
            f2[x]=nod;

            ++sol;
            return true;
        }
    }

    for(int i=0;i<v1[nod].size();++i)
    {
        x=v1[nod][i];
        if ((cost[nod][x]) > 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;
}