#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<map>
#include<set>
#include<queue>
#include<algorithm>

using namespace std;

int INF, N, K, cod_a[309], cod_b[309], cost[309][309], pot[10009], a[309], b[309], st[309], dr[309], C[309];
vector < int > muchii[10009], v[309];

bool cupl (int nod)
{
    if (C[nod]) return 0;
    C[nod] = 1;
    for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it ++)
        if ( st[*it] == 0 )
        {
            st[*it] = nod;
            dr[nod] = *it;
            return 1;
        }
    for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it ++)
        if ( st[*it] != 0 && cupl (st[*it]) )
        {
            st[*it] = nod;
            dr[nod] = *it;
            return 1;
        }
    return 0;
}

int Cuplaj ()
{
    for (int i=1; i<=K; i++)
        C[i] = 0, st[i] = 0, dr[i] = 0;
    int cup = 1;
    while (cup)
    {
        cup = 0;
        for (int i=1; i<=K; i++)
            C[i] = 0;
        for (int i=1; i<=K; i++)
            if (dr[i] == 0) cup += cupl (i);
    }
    cup = 0;
    for (int i=1; i<=K; i++)
        if (dr[i]) cup ++;
    return cup;
}

bool ok (int val)
{
    for (int i=1; i<=K; i++)
        for (int j=1; j <= K; j++)
            if (cost[i][j] <= val)
                v[i].push_back (j);

    int cuple = Cuplaj ();

    for (int i=1; i<=K; i++)
        v[i].clear();
    return (cuple == K);
}

void bfs (int nod)
{
    queue < int > q;
    q.push (nod);
    while (!q.empty())
    {
        int nod = q.front();
        q.pop();
        for (vector < int > :: iterator it = muchii[nod].begin(); it != muchii[nod].end(); it ++)
            if (pot[*it] == -1)
            {
                pot[*it] = pot[nod] + 1;
                q.push (*it);
            }
    }
}

int main()
{
//freopen ("input", "r", stdin);
//freopen ("output", "w", stdout);

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]);

INF = 1<<28;

for (int i=1; i<=N; i++)
{
    int x, y;
    scanf ("%d %d", &x, &y);
    muchii[x].push_back (y);
    muchii[y].push_back (x);
}

for (int i=1; i<=K; i++)
{
    for (int j=1; j<=N; j++)
        pot[j] = -1;

    pot[a[i]] = 0;

    bfs (a[i]);

    for (int j=1; j<=K; j++)
        cost[i][j] = pot[b[j]];
}

int p, u, mij, ras;

p = 0;
u = N;
while (p <= u)
{
    mij = (p + u) >> 1;
    if (ok (mij))
        ras = mij, u = mij - 1;
    else
        p = mij + 1;
}
printf ("%d\n", ras);

return 0;
}