#include #include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) using p = pair; int inf = 1e9; int main(){ int n, m; cin >> n >> m; vector

vp(m); rep(i, m){ int u, v; cin >> u >> v; vp[i] = {u-1, v-1}; } int k; cin >> k; set a; rep(i, k){ int b; cin >> b; a.insert(b-1); } vvi adj(6*n); rep(i, m){ auto [u, v] = vp[i]; if(a.count(v)){ rep(j, 5){ adj[u+j*n].push_back(v+j*n + n); } }else{ rep(j, 5){ adj[u+j*n].push_back(v); } } if(a.count(u)){ rep(j, 5){ adj[v+j*n].push_back(u+j*n + n); } }else{ rep(j, 5){ adj[v+j*n].push_back(u); } } } queue q; q.push(0); vi dist(6*n, inf); dist[0] = 0; while(!q.empty()){ int u = q.front(); q.pop(); for(auto v:adj[u]){ if(dist[v] == inf){ dist[v] = dist[u]+1; q.push(v); } } } int ans = inf; rep(i, 5)ans = min(ans, dist[i*n-1 + n]); cout << (ans == inf ? -1 : ans) << endl; return 0; }