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

int N, M, K, S, P, Q;
queue< int > zombie;
vector< int > graph[100001];
int danger[100001];

void preBFS()
{
  while(!zombie.empty()) {
    int p = zombie.front(); zombie.pop();
    for(int to : graph[p]) {
      if(~danger[to]) continue;
      danger[to] = danger[p] + 1;
      zombie.push(to);
    }
  }
}

long long Dijkstra()
{
  typedef pair< long long, int > Pi;
  priority_queue< Pi, vector< Pi >, greater< Pi > > que;
  long long v[100001];
  fill_n(v, 100001, 1LL << 58);
  que.emplace(0, 1);
  v[1] = 0;
  while(!que.empty()) {
    long long cost, now;
    tie(cost, now) = que.top(); que.pop();
    if(cost > v[now]) continue;
    for(int to : graph[now]) {
      if(danger[to] == 0) continue;
      if(to == N) return(cost);
      long long next = cost + (danger[to] > S ? P : Q);
      if(next >= v[to]) continue;
      v[to] = next;
      que.emplace(next, to);
    }
  }
  return(-1);
}
int main()
{
  scanf("%d %d %d %d", &N, &M, &K, &S);
  scanf("%d %d", &P, &Q);

  memset(danger, -1, sizeof(danger));
  while(K--) {
    int C;
    scanf("%d", &C);
    zombie.push(C);
    danger[C] = 0;
  }
  while(M--) {
    int A, B;
    scanf("%d %d", &A, &B);
    graph[A].push_back(B);
    graph[B].push_back(A);
  }
  preBFS();
  printf("%lld\n", Dijkstra());
}