#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
using namespace std;
int n,m,i,j,x,y,no,k,u,maxi = 0;
unordered_map<int,bool> h;
queue<int> q;
bool ok;
int main()
{
    cin>>n>>k;
    int d[n+2];
    vector<int> v[n+2];
    bool spec[n+2],viz[n+2];
    for(i=1;i<=n;i++)
        spec[i] = false;
    for(i=1;i<=k;i++)
    {
        cin>>no;
        spec[no] = true;
    }
    for(i=1;i<=k;i++)
    {
        cin>>no;
        h[no] = true;
    }
    for(i=1;i<=n-1;i++)
    {
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    unordered_map<int,bool>::iterator ite;
    for(i=1;i<=n;i++)
        if(spec[i])
        {
             ite = h.find(i);
             if(ite!=h.end())
             h.erase(i);
        }
    if(!h.empty())
    {
        for(j=1;j<=n;j++)
           if(spec[j])
        {
            q.push(j);
            for(i=1;i<=n;i++)
            {
                 viz[i] = false;
                 d[i] = 0;
            }
            viz[j] = true;
            ok = true;
            while(ok == true)
            {
                u = q.front();
                q.pop();
                for(auto it = v[u].begin();it!=v[u].end()&&ok == true;it++)
                    if(!viz[*it])
                    {
                        d[*it] = d[u]+1;
                        q.push(*it);
                        if ((ite=h.find(*it))!=h.end())
                        {
                            if (d[*it]>maxi)
                                maxi = d[*it];
                            h.erase(*it);
                            ok = false;
                        }
                        viz[*it] = true;
                    }
            }
            while(!q.empty())
                q.pop();
        }
    }
    cout<<maxi;
    return 0;
}