#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

const int MAX_N = 10100;
const int MAX_K = 310;

vector<int> A[MAX_N];

int adj[MAX_K][MAX_K];
int d[MAX_K];
int s[MAX_K];
int n, k;

int dist[MAX_N];

void bfs(int st, int adj[MAX_K]) {
    memset(dist, 0, sizeof(dist));
    queue<int> Q;
    Q.push(st);
    dist[st] = 1;
    while(!Q.empty()) {
        int nod = Q.front();
        Q.pop();
        for(auto it : A[nod]) {
            if(!dist[it]) {
                dist[it] = dist[nod] + 1;
                Q.push(it);
            }
        }
    }

    for(int i = 1; i <= k; i++) {
        adj[i] = dist[d[i]] - 1;
    }
}

vector<int> B[MAX_K];

void make(int cost) {
    for(int i = 1; i <= k; i++) {
        B[i].clear();
    }
    for(int i = 1; i <= k; i++) {
        for(int j = 1; j <= k; j++) {
            if(adj[i][j] <= cost) {
                B[i].push_back(j);
            }
        }
    }
}

int viz[MAX_K];
int l[MAX_K];
int r[MAX_K];

int pairup(int nod) {
    if(viz[nod]) {
        return 0;
    }
    viz[nod]=1;
 
    for(auto it : B[nod]) {
        if(!r[it]) {
            l[nod]=it;
            r[it]=nod;
            return 1;
        }
    }
 
    for(auto it : B[nod]) {
        if(pairup(r[it])) {
            l[nod]=it;
            r[it]=nod;
            return 1;
        }
    }
 
    return 0;
}

bool cuplaj(int cost) {
    make(cost);
    memset(l, 0, sizeof(l));
    memset(r, 0, sizeof(r));

    bool change=true;
    while(change) {
        change=false;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=k;i++) {
            if(!l[i]) {
                if(pairup(i)) {
                    change=true;
                }
            }
        }
    }
 
    int sz=0;
    for(int i=1;i<=k;i++) {
        if(l[i]) {
            sz++;
        }
    }
    return sz == k; 
}

int search(int st, int dr) {
    int ans = 0;
    while(st <= dr) {
        int mij = (st + dr) / 2;
        if(cuplaj(mij)) {
            ans = mij;
            dr = mij - 1;
        }
        else {
            st = mij + 1;
        }
    }
    return ans;
}

int main() {
    //ifstream cin("fis.in");
    //ofstream cout("fis.out");
    cin >> n >> k;
    for(int i = 1; i <= k; i++) {
        cin >> s[i];
    }
    for(int i = 1; i <= k; i++) {
        cin >> d[i];
    }
    for(int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        A[a].push_back(b);
        A[b].push_back(a);
    }
    for(int i = 1; i <= k; i++) {
        bfs(s[i], adj[i]);
    }
    cout << search(0, n);
    return 0;
}