#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <string>
#include <fstream>
#include <cctype>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <bitset>

using namespace std;

int a[10001];
int b[10001];

vector<int> V[10001];


int euler[3*10001];
int nivel[3*200001];

bitset<40001> used;
bitset<40001> usedServer;

int dista[301][301];
int dmin[301][301];
int auxn;
int rmq[3*10001][24];
int loog[3*10001];
int f[3*10001];
int nivell[10001];

void create_euler(int nod,int niv)
{
    euler[++auxn] = nod;
    f[nod] = auxn;
    nivell[nod] = niv;
    nivel[auxn] = niv;
    used[nod] = true;
    for(vector<int>::iterator it = V[nod].begin(); it != V[nod].end(); it++)
    if(!used[*it])
    {


        create_euler(*it,niv+1);
        euler[++auxn] = nod;
        nivel[auxn] = niv;

    }
}


int LCA(int x, int y)
{
    x = f[x],y = f[y];
        if(x > y) swap(x,y);
        int l = loog[y-x+1];
        if(nivel[rmq[x][l]] < nivel[rmq[y - (1<<l)+1][l]])
            return euler[rmq[x][l]];
        else return euler[rmq[y-(1<<l)+1][l]];
}

int getDist(int x, int y)
{
    int L = LCA(x,y);
    return nivell[x] + nivell[y] - 2*nivell[L];
}


int main()
{
    //freopen("1.in","r",stdin);
    //freopen("1.out","w",stdout);
    int n,k;
    cin>>n>>k;
    for(int i = 1; i <= k; i++)
        cin>>a[i];
    for(int j = 1; j <= k; j++)
        cin>>b[j];
    int x,y;
    for(int i = 1; i < n;i ++)
    {
        cin>>x>>y;
        V[x].push_back(y);
        V[y].push_back(x);
    }


    create_euler(1,0);
    int nn = n;
    n = auxn;
    for(int i=1;i<=n;i++)
    {
        rmq[i][0] = i;
        if(i>1)
            loog[i] = 1+loog[i>>1];
    }
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            if(nivel[ rmq[i][j-1] ] < nivel[  rmq[i + (1<<(j-1)) ][j-1] ])
                rmq[i][j] = rmq[i][j-1];
            else rmq[i][j] = rmq[i + (1<<(j-1))][j-1];



    for(int i = 1; i <= k; i++)
        for(int j = 1; j <= k; j++)
        {
            dista[i][j] = getDist(a[i],b[j]);
            dmin[i][j] = dista[i][j];
        }

    for(int i = 1; i <= k; i++)
        for(int j = k-1; j >= 1; j--)
            if(dmin[i][j+1] < dmin[i][j])
                dmin[i][j] = dista[i][j];

    int solutieL = 1;
    for(int i = 1; i<=k;i++ )
    {
        int ind = 0;
        int diff = 999999;
        for(int j = 1; j<=k;j++)
            if(!usedServer[j] && dista[i][j] - dmin[i][j] < diff)
            {
                diff = dista[i][j] - dmin[i][j];
                solutieL = max(solutieL, dista[i][j]);
                ind = i;
            }
        usedServer[ind] = true;

    }



    cout<<solutieL<<'\n';
    return 0;
}

// FILE!!!!!