#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 100001
#define INF 1e11
typedef long long ll;
vector<int> adj[MAXN];
ll dist[MAXN];
bool visited[MAXN];
int N,M,K,S;
ll p,q;
vector<int> zombi;
bool zombi_used[MAXN];
struct node{
int cur;
ll w;
bool operator < (const node& a) const{
return a.w < w;
}
};
void bfs(){
queue<pair<int,int> > q;
for (int i = 0 ;i < K; i++){
q.push({zombi[i],0});
visited[zombi[i]] = true;
}
while (!q.empty()){
int cur = q.front().first;
int cnt = q.front().second;
q.pop();
if (cnt == S) continue;
for (int i = 0 ; i < adj[cur].size(); i++){
int next = adj[cur][i];
if (visited[next]) continue;
visited[next] = true;
q.push({next,cnt+1});
}
}
}
void dijkstra(){
priority_queue<node> pq;
pq.push({1,0});
dist[1] = 0;
while (!pq.empty()){
int cur = pq.top().cur;
ll cur_w = pq.top().w;
pq.pop();
if (dist[cur] != cur_w) continue;
for (int i = 0 ;i < adj[cur].size(); i++){
int next = adj[cur][i];
ll next_w = cur_w;
if (zombi_used[next]) continue;
if (next != N) {
if (visited[next]) next_w+=q;
else next_w += p;
}
if (dist[next] > next_w){
dist[next] = next_w;
pq.push({next,dist[next]});
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M >> K >> S;
cin >> p >> q;
for (int i = 1; i <=N; i++){
dist[i] = INF;
}
for (int i = 0 ; i < K; i++){
int tmp;
cin >> tmp;
zombi_used[tmp] = true;
zombi.push_back(tmp);
}
for (int i = 0 ;i < M; i++){
int u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
bfs();
dijkstra();
cout <<dist[N] <<"\n";
return 0;
}