#if __has_include() #include using namespace atcoder; #else #include #if __has_include() #include using namespace atcoder; #endif #endif using namespace std; #define int long long #define all(x) (x).begin(), (x).end() #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, n) for(int i = (int)((n) - 1); i >= 0; i--) template bool chmax(T &a,const T &b){if(a bool chmin(T &a,const T &b){if(a>b){a=b;return true;}return false;} // using mint = modint; signed main(){ int n, m; cin >> n >> m; vector g(n, vector(0)); while(m--){ int u, v; cin >> u >> v; u--; v--; g.at(u).emplace_back(v); g.at(v).emplace_back(u); } int k; cin >> k; vector iwai(n, false); while(k--){ int a; cin >> a; a--; iwai.at(a) = true; } vector seen(5 * n, -1); seen.at(0) = 0; deque bfs; bfs.emplace_back(0); while(!bfs.empty()){ int from = bfs.front(); bfs.pop_front(); for(auto t : g.at(from % n)){ int to = t + (iwai.at(t) ? from / n * n + n : 0); if(to >= 5 * n || seen.at(to) != -1) continue; seen.at(to) = seen.at(from) + 1; bfs.emplace_back(to); } } int ans = 1ll << 60; rep(i, 5) if(seen.at(n - 1 + i * n) != -1) chmin(ans, seen.at(n - 1 + i * n)); // rep(i, 5) cout << seen.at(n - 1 + i * n) << '\n'; cout << (ans == 1ll << 60 ? -1 : ans) << '\n'; } /* 頂点を5倍にする? streakを途切れさせる処理を入れていない */