//dijkstra //TLE #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; //#define endl "\n"; const long long INF = 1000000000000000000; ll N, M, K, A[100009], visited[100009]; vector> preG; //dijkstra struct edge{ ll pre, to; ll cost; }; vector> G; vector dijkstra(int start = 0) { int N = G.size(); vector dist(N, INF); using classPQ = pair; priority_queue, greater> que; que.emplace(0, start); dist[start] = 0; while(!que.empty()){ auto [d, c] = que.top(); que.pop(); if(dist[c] != d) continue; for(auto& e : G[c]){ if(d + e.cost < dist[e.to]){ dist[e.to] = d + e.cost; que.emplace(dist[e.to], e.to); } } } return dist; } int main(){ cin >> N >> M; preG.resize(N + 1); G.resize(N + 1); for(int i = 0; i < M; i++){ ll u, v; cin >> u >> v; preG[u].push_back(v); preG[v].push_back(u); } cin >> K; for(int i = 0; i < K; i++){ ll a; cin >> a; A[a] = 1; } //空き頂点間を探索 int idx = 0; for(int i = 1; i <= N; i++){ if(A[i] == 0){ idx++; queue> que; visited[i] = idx; que.push({i, 0}); while(!que.empty()){ auto [pos, cnt] = que.front(); que.pop(); for(auto to: preG[pos]){ if(visited[to] < idx){ if(A[to] == 1 && cnt < 4){ visited[to] = idx; que.push({to, cnt + 1}); } if(A[to] == 0){ visited[to] = idx; G[i].push_back(edge{i, to, cnt + 1}); G[to].push_back(edge{to, i, cnt + 1}); } } } } } } auto dist = dijkstra(1); if(dist[N] == INF) cout << -1 << endl; else cout << dist[N] << endl; return 0; }