#include <algorithm>
#include <vector>
#include <cstdio>
#include <iostream>
#include <queue>
#include <set>
#include <utility>
#include <cstring>
#include <cstdlib>

using namespace std;

const int MAXN = ( 1 << 17 );

int used[MAXN];
int dist[3][MAXN]; // zero is distance from start, one is distance from finish
int N, M, S, T, F;
vector < int > v[MAXN];
int c[MAXN];
set < pair < int, int > > st;
int path[MAXN];
queue < int > q;
int rem[MAXN];
int when[MAXN];
int forbidden[MAXN];
void scan(){
    scanf ( "%d%d%d%d%d", &N, &M, &S, &T, &F );
    
    for ( int i = 0; i < M; ++i ){
        int x, y;
        
        scanf ( "%d%d", &x, &y );
        
        v[x].push_back ( y );
        v[y].push_back ( x );
    }
    
    int last = S;
    when[S] = T + 1;
    for ( int i = 0; i < T; ++i ){
        int x;
        scanf ("%d", &x );
        when[x] = T - i;
        st.insert ( make_pair ( last, x ) );
        st.insert ( make_pair ( x, last ) );
        forbidden[x] = 1;
        last = x;
        
    }
}

void bfs ( int idx, int i ){
    dist[idx][i] = 1;
    q.push ( i );
    
    while ( !q.empty() ){
        i = q.front();
        q.pop();
        
        for ( int j = 0; j < (int)v[i].size(); ++j )
            if ( !dist[idx][v[i][j]] ){
                if ( ( !st.count ( make_pair ( i, v[i][j] ) ) && !forbidden[ v[i][j] ] ) || idx ){
                    if ( idx == 2 )
                        if ( dist[idx][i]  < when[ v[i][j] ] )
                            continue;
                    dist[idx][v[i][j]] = dist[idx][i] + 1;
                    q.push ( v[i][j] );
                }
            }
    }
}

void dfs( int i, int idx, int prev){
    used[i] = 1;
    path[idx] = i;
    rem[i] = idx;
   // cout << i << " " << idx << endl;
    for ( int j = 0; j < (int)v[i].size(); ++j ) if ( v[i][j] != prev ) 
        if ( !st.count ( make_pair ( i, v[i][j] ) ) && !forbidden[ v[i][j] ] ){
            if ( !used[ v[i][j] ] )
                dfs ( v[i][j], idx + 1, i );
            else{
                int sz = idx - rem[ v[i][j] ] + 1;
       //         cout << i << " " << v[i][j] << " " << sz << endl;
                if ( sz <= T )
                    continue;
                for ( int k = rem[ v[i][j] ]; k <= idx; ++k )
                    if ( !c[path[k] ] || c[path[k] ] > sz ) c[ path[k] ] = sz;
            }
        }
}

void solve(){
    bfs ( 0, S );
    bfs ( 1, F );
    bfs ( 2, S );
   // cou
    memset ( used, 0, sizeof ( used ) );
    if ( dist[0][F] ){
        printf ( "%d\n", dist[0][F] - 1 );
        return;
    }
    if ( dist[2][F] ){
        printf ( "%d\n", dist[2][F] - 1 );
        return;
    }
    
    dfs(S, 0, -1 );
  //  for ( int i = 1; i <= N; ++i )
    //    cout << i << " " << c[i] << endl;
    
    int res = 1e9;
    for ( int i = 1; i <= N; ++i )
        if ( c[i] ){
            if ( res > dist[0][i] - 1 + c[ i ] + dist[1][i] - 1 )
                res = dist[0][i] - 1 + c[ i ] + dist[1][i] - 1;
          //      cout << i << " " << c[i] << endl;
        }
    if ( res != 1e9 )
        printf ( "%d\n", res );
    else
        printf ( "NO\n" );
}

int main(){
    scan();
    solve();
}