#include #include #include #include #include #include #include #include #include #include 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; }