#include int u[200005], v[200005]; int h[200005], l; int comp_h(int a, int b) { if (u[h[a]] > u[h[b]]) return 1; else return -1; } void swap_h(int a, int b) { int f = h[a]; h[a] = h[b]; h[b] = f; return; } void push(int ne) { h[l] = ne; int p = l++; for (; p > 0; p = (p - 1) / 2) if (comp_h((p - 1) / 2, p) > 0) swap_h((p - 1) / 2, p); return; } int pop() { swap_h(0, --l); int p = 0; for (;;) { if (2 * p + 2 < l) { if (comp_h(2 * p + 1, 2 * p + 2) > 0) { if (comp_h(p, 2 * p + 2) > 0) swap_h(p, 2 * p + 2); p = 2 * p + 2; } else { if (comp_h(p, 2 * p + 1) > 0) swap_h(p, 2 * p + 1); p = 2 * p + 1; } } else if (2 * p + 1 < l) { if (comp_h(p, 2 * p + 1) > 0) swap_h(p, 2 * p + 1); p = 2 * p + 1; } else break; } return h[l]; } int id[200005]; int a[100005]; int val[100005]; int q[500005], left, right; int dist[100005][5]; int main() { int n, m; scanf("%d %d", &n, &m); int i, j; for (i = 0; i < m; i++) { scanf("%d %d", &u[i], &v[i]); u[i + m] = --v[i]; v[i + m] = --u[i]; } m *= 2; int k; scanf("%d", &k); for (i = 0; i < k; i++) scanf("%d", &a[i]); for (i = 0; i < n; i++) val[i] = 0; for (i = 0; i < k; i++) val[--a[i]]++; l = 0; for (i = 0; i < m; i++) push(i); for (i = 0; i < m; i++) id[i] = pop(); id[m] = m; u[m] = -1; int min, mid, max; for (i = 0; i < n; i++) for (j = 0; j < 5; j++) dist[i][j] = 1e9; dist[0][0] = 0; q[0] = 0; left = 0; right = 1; while (left < right) { i = q[left]; left++; j = i % 5; i /= 5; min = -1; max = m; while (max - min > 1) { mid = (max + min) / 2; if (u[id[mid]] < i) min = mid; else max = mid; } for (; u[id[max]] == i; max++) { if (val[v[id[max]]] > 0) { if (j < 4) { if (dist[v[id[max]]][j + 1] > dist[i][j] + 1) { dist[v[id[max]]][j + 1] = dist[i][j] + 1; q[right] = 5 * v[id[max]] + j + 1; right++; } } } else { if (dist[v[id[max]]][0] > dist[i][j] + 1) { dist[v[id[max]]][0] = dist[i][j] + 1; q[right] = 5 * v[id[max]]; right++; } } } } int ans = 1e9; for (j = 0; j < 5; j++) if (ans > dist[n - 1][j]) ans = dist[n - 1][j]; if (ans > 1e7) ans = -1; printf("%d\n", ans); return 0; }