#include<bits/stdc++.h>
#define int long long int
#define MP make_pair
#define PB push_back
#define F first
#define S second
using namespace std;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef vector<PII> VP;

const int INF = 4e18;

int n, m, k, s, p, q;
int c[100010], a[200010], b[200010];

int price[100010];
VI node[100010];

queue<int> qu;
bool zombi[100010];
bool visited[100010];

int cheap[100010];
priority_queue<PII, VP, greater<PII> > pq;

void bfs()
{
  for(int i = 0; i < k; i++){
    qu.push(c[i]);
    zombi[c[i]] = true;
  }

  for(int i = 0; i <= s; i++){
    int sz = qu.size();

    for(int j = 0; j < sz; j++){
      int now = qu.front();
      qu.pop();

      if(!visited[now]){
	visited[now] = true;

	for(auto pt:node[now]){
	  qu.push(pt);
	}
      }
    }
  }
}

void dijk()
{
  memset(cheap, -1, sizeof cheap);
  pq.push(MP(0, 1));
  while(!pq.empty()){
    PII now = pq.top();
    pq.pop();
    if(cheap[now.S] == -1){
      cheap[now.S] = now.F;

      for(auto pt:node[now.S]){
	if(!zombi[pt]){
	  pq.push(MP(now.F + price[pt], pt));
	}
      }
    }
  }
}
     
signed main()
{
  scanf("%lld%lld%lld%lld%lld%lld", &n, &m, &k, &s, &p, &q);
  for(int i = 0; i < k; i++){
    scanf("%lld", &c[i]);
  }
  for(int i = 0; i < m; i++){
    scanf("%lld%lld", &a[i], &b[i]);
  }
  
  for(int i = 0; i < m; i++){
    node[a[i]].PB(b[i]);
    node[b[i]].PB(a[i]);
  }

  bfs();

  for(int i = 2; i <= n - 1; i++){
    price[i] = visited[i] ? q : p;
  }

  dijk();

  printf("%lld\n", cheap[n]);
  
  return 0;
}