#include #include using namespace std; using namespace atcoder; using ll = long long; using ld = long double; ll INF = 2e18; template using vc = vector; template using vv = vc>; #define MP(a, b) make_pair(a, b) #define nfor(i,s,n) for(ll i=s;i<(ll)n;i++) #define rep(i,n) for(ll i = 0; i < (n); i++) using vl = vc; using vvl = vv; using vvvl = vv; using vvvvl = vv; using vs = vc; using vvs = vv; using vb = vc; using vvb = vv; using vvvb = vv; using vld = vc; using vvld = vv; using vvvld = vv; using P = pair; templateistream& operator>>(istream& i, vc& v) { rep(j, size(v))i >> v[j]; return i; } template using pq = priority_queue>;//大きい順 template using pq_g = priority_queue, greater>;//小さい順 #define pb push_back #define pob pop_back #define all(s) s.begin(),s.end() #define YES std::cout<<"Yes"<; using vvm = vc; int main(){ ll n, m; cin >> n >> m; vvl g(n); rep(i, m){ ll a, b; cin >> a >> b; a--; b--; g[a].pb(b); g[b].pb(a); } vb b(n, false); ll k; cin >> k; rep(i, k){ ll c; cin >> c; c--; b[c] = true; } vvl dist(n, vl(5, INF)); dist[0][0] = 0; queue

q; q.push({0, 0}); while(!q.empty()){ auto [v, s] = q.front(); q.pop(); ll d = dist[v][s]; for(auto nv : g[v]){ ll ns = 0; if(b[nv]) ns = s + 1; if(ns > 4) continue; if(dist[nv][ns] > d + 1){ dist[nv][ns] = d + 1; q.push({nv, ns}); } } } ll ans = INF; rep(i, 5) ans = min(ans, dist[n-1][i]); if(ans == INF){ dame; }else{ cout << ans << endl; } }