#include<bits/stdc++.h>
using namespace std;

typedef long long lint;
typedef pair<int, int> P;
#define REP(i, x, n) for(int i = x ; i < n ; ++i)
#define rep(i, n) for(int i = 0 ; i < n ; ++i)
#define repr(i, n) for(int i = n - 1 ; i >= 0 ; --i)
#define ALL(x) (x).begin(), (x).end()
#define SORT(x) sort((x).begin(), (x).end())

const int IINF = 1e9 + 10;
const long long LLINF = (long long)1e18 + 10;
const long long MOD = (long long)1e9 + 7;
const int dx4[] = {1, 0, -1, 0}, dy4[] = {0, 1, 0, -1};
const int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1}, dy8[] = {0, -1, -1, -1, 0, 1, 1, 1};
const double EPS = 1e-8;

struct node{
    int id;
    lint cost;

    bool operator<(const node &right) const {
        return cost > right.cost;
    }
};

int main(){
    int n, m, k, s;
    lint p, q;
    cin >> n >> m >> k >> s >> p >> q;
    vector< vector<int> > g(n);
    vector<bool> zombie(n);
    rep(i, k){
        int c;
        cin >> c;
        --c;
        zombie[c] = true;
    }
    rep(i, m){
        int a, b;
        cin >> a >> b;
        --a;
        --b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    vector<int> dis(n, IINF);
    rep(i, n){
        if(zombie[i] && dis[i] == IINF){
            queue< P > bfs;
            bfs.push({i, 0});
            while(!bfs.empty()){
                P now = bfs.front();
                bfs.pop();
                if(zombie[now.first]){
                    now.second = 0;
                }
                if(now.second > s || dis[now.first] <= now.second){
                    continue;
                }
                dis[now.first] = now.second;
                for(auto x : g[now.first]){
                    if(dis[x] > now.second + 1){
                        bfs.push({x, now.second + 1});
                    }
                }
            }
        }
    }
    vector<bool> danger(n);
    rep(i, n){
        danger[i] = dis[i] <= s;
    }
    vector<lint> cost(n, LLINF);
    priority_queue<node> dij;
    dij.push({0, 0});
    while(!dij.empty()){
        node now = dij.top();
        dij.pop();
        if(cost[now.id] <= now.cost){
            continue;
        }
        cost[now.id] = now.cost;
        for(auto x : g[now.id]){
            if(!zombie[x]){
                if(danger[x] && cost[x] > now.cost + q && x != n - 1){
                    dij.push({x, now.cost + q});
                }else if(!danger[x] && cost[x] > now.cost + p && x != n - 1){
                    dij.push({x, now.cost + p});
                }else if(cost[x] > now.cost && x == n - 1){
                    dij.push({x, now.cost});
                }
            }
        }
    }
    cout << cost.back() << endl;
    return 0;
}
