#include #include using namespace std; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; #define FAST_IO \ ios::sync_with_stdio(false); \ cin.tie(0); const i64 INF = 1001001001001001001; using Modint = atcoder::static_modint<998244353>; int main() { FAST_IO int N, M; cin >> N >> M; vector U(M), V(M); for (int i = 0; i < M; i++) { cin >> U[i] >> V[i]; U[i]--, V[i]--; } int K; cin >> K; vector A(K); for (int i = 0; i < K; i++) { cin >> A[i]; A[i]--; } set st; for (int i = 0; i < K; i++) { st.insert(A[i]); } vector> G(N); for (int i = 0; i < M; i++) { G[U[i]].push_back(V[i]); G[V[i]].push_back(U[i]); } int m = 5; vector> dist(N, vector(m, INF)); using P = pair>; priority_queue, greater

> pq; dist[0][0] = 0; pq.push({0, {0, 0}}); while (!pq.empty()) { auto [d, p] = pq.top(); pq.pop(); auto [v, rem] = p; if (d > dist[v][rem]) continue; for (auto to : G[v]) { int nrem = st.contains(to) ? rem + 1 : 0; if (nrem < m && dist[to][nrem] > d + 1) { dist[to][nrem] = d + 1; pq.push({d + 1, {to, nrem}}); } } } i64 ans = INF; for (int i = 0; i < m; i++) { ans = min(ans, dist[N - 1][i]); } if (ans == INF) ans = -1; cout << ans << endl; }