#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <functional>

using namespace std;

#define int long long

#define fst first
#define scd second
#define PB push_back
#define MP make_pair
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define omajinai ios::sync_with_stdio(false);cin.tie(0)
#define rep(i,x) for(int i=0;i<(int)(x);++i)
#define rep1(i,x) for(int i=1;i<=(int)(x);++i)
#define rrep(i,x) for(int i=(int)x-1;i>=0;--i)
#define rrep1(i,x) for(int i=(int)x;i>=1;--i)

using ll=long long;
using ld=long double;
using vi=vector<int>;
using vvi=vector<vi>;
using pii=pair<int, int>;
using vpii=vector<pii>;

template<class T,class U>ostream&operator<<(ostream&os,const pair<T,U>p){os<<"("<<p.fst<<", "<<p.scd<<")";return os;}
template<class T>ostream&operator<<(ostream&os,const vector<T>v){rep(i,v.size()){if(i)os<<", ";os<<v[i];}return os;}
template<typename T>T&max(T&a,T&b){if(a>=b)return a;return b;}
template<typename T>T&min(T&a,T&b){if(a < b)return a;return b;}
template<typename T>bool chmax(T&a,T b){if(a < b){a=b;return true;}return false;}
template<typename T>bool chmin(T&a,T b){if(a > b){a=b;return true;}return false;}

constexpr int inf = 3e18;
constexpr double eps = 1e-9;

struct edge { int to, cost; edge(int to, int cost) : to(to), cost(cost) {} };
typedef vector<edge> edges;

int N, M, K, S;
int P, Q;

int zdist[100010];
int d[100010];
queue<pii> q;
vi G1[100010];
edges G[100010];

void bfs()
{
    while (q.size()) {
        pii p = q.front(); q.pop();

        int v = p.fst, dist = p.scd;
        for (int u : G1[v]) {
            if (zdist[u] <= dist + 1) continue;

            zdist[u] = dist + 1;

            q.push(pii(u, zdist[u]));
        }
    }
}

void build_graph()
{
    rep(i, N) {
        if (zdist[i] == 0 || i == N - 1) continue;

        for (int v : G1[i]) {
            if (zdist[v] == 0) continue;

            if (v == N - 1) {
                G[i].PB(edge(v, 0));
                continue;
            }

            G[i].PB(edge(v, zdist[v] <= S ? Q : P));
            G[v].PB(edge(i, zdist[i] == 0 ? inf : (zdist[i] <= S ? Q : P)));
        }
    }
}

void dijkstra()
{
    priority_queue<pii, vpii, greater<pii>> pq;
    d[0] = 0;
    pq.push(pii(0, 0));

    while (pq.size()) {
        pii p = pq.top(); pq.pop();

        int v = p.scd;

        if (d[v] < p.fst) continue;

        for (edge e : G[v]) {
            if (d[e.to] > d[v] + e.cost) {
                d[e.to] = d[v] + e.cost;
                pq.push(pii(d[e.to], e.to));
            }
        }
    }
}

signed main()
{
    cin >> N >> M >> K >> S;
    cin >> P >> Q;

    rep(i, N + 1) {
        zdist[i] = inf;
        d[i] = inf;
    }

    rep(i, K) {
        int C; cin >> C;
        --C;
        zdist[C] = 0;
        q.push(pii(C, 0));
    }

    rep(i, M) {
        int A, B; cin >> A >> B;
        --A, --B;
        G1[A].PB(B);
        G1[B].PB(A);
    }

    bfs();
    build_graph();
    dijkstra();

    cout << d[N - 1] << endl;
}

Measured memory_bytes: 32828