import java.util.Arrays; import java.util.InputMismatchException; import java.util.ArrayList; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.IOException; /** * Built using CHelper plug-in * Actual solution is at the top * @author George Marcus */ public class prog { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); kspecialists solver = new kspecialists(); solver.solve(1, in, out); out.close(); } } class kspecialists { int[] specNode; int[] serverInNode; ArrayList[] A; int[][] D; int[] left; int[] right; boolean[] v; int K; int U; public void solve(int testNumber, InputReader in, PrintWriter out) { int N = in.nextInt(); K = in.nextInt(); specNode = new int[N]; serverInNode = new int[N]; for (int i = 0; i < K; i++) { int a = in.nextInt(); a--; specNode[i] = a; } Arrays.fill(serverInNode, -1); for (int i = 0; i < K; i++) { int b = in.nextInt(); b--; serverInNode[b] = i; } A = new ArrayList[N]; for (int i = 0; i < N; i++) { A[i] = new ArrayList(); } for (int i = 0; i < N - 1; i++) { int a = in.nextInt() - 1; int b = in.nextInt() - 1; A[a].add(b); A[b].add(a); } D = new int[K][K]; for (int i = 0; i < K; i++) { dfs(specNode[i], -1, 0, D[i]); } left = new int[K]; right = new int[K]; v = new boolean[K]; int st = 0; int dr = N; int m = -1; int ans = -1; while (st <= dr) { m = (st + dr) / 2; if (match(m) == K) { ans = m; dr = m - 1; } else { st = m + 1; } } out.println(ans); } private int match(int upper) { Arrays.fill(left, -1); Arrays.fill(right, -1); Arrays.fill(v, false); U = upper; int ret = 0; boolean ok = true; while (ok) { ok = false; Arrays.fill(v, false); for (int i = 0; i < K; i++) { if (right[i] == -1 && pairup(i)) { ret++; ok = true; } } } return ret; } private boolean pairup(int node) { if (v[node]) { return false; } v[node] = true; for (int i = 0; i < K; i++) { if (D[node][i] <= U) { if (left[i] == -1) { left[i] = node; right[node] = i; return true; } } } for (int i = 0; i < K; i++) { if (D[node][i] <= U) { if (pairup(left[i])) { left[i] = node; right[node] = i; return true; } } } return false; } private void dfs(int node, int prev, int dist, int[] D) { if (serverInNode[node] != -1) { D[ serverInNode[node] ] = dist; } for (int x : A[node]) { if (x != prev) { dfs(x, node, dist + 1, D); } } } } class InputReader { private InputStream stream; private byte[] buf = new byte[1024]; private int curChar; private int numChars; public InputReader(InputStream stream) { this.stream = stream; } public int read() { if (numChars == -1) throw new InputMismatchException(); if (curChar >= numChars) { curChar = 0; try { numChars = stream.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (numChars <= 0) return -1; } return buf[curChar++]; } public int nextInt() { return Integer.parseInt(nextString()); } public String nextString() { int c = read(); while (isSpaceChar(c)) c = read(); StringBuffer res = new StringBuffer(); do { res.appendCodePoint(c); c = read(); } while (!isSpaceChar(c)); return res.toString(); } private boolean isSpaceChar(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } }