#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<utility>
#include<climits>
using namespace std;
typedef long long Int;
typedef pair<Int,Int> Pair;

#define N_MAX 100000
#define M_MAX 200000

int N,M,K,S;
int P,Q;
vector<int> load[N_MAX];
int zd[N_MAX];
bool done[N_MAX];
Int cost[N_MAX];

int main(){
	int i;
	int a,b;
	queue<Pair> q;

	cin>>N>>M>>K>>S;
	cin>>P>>Q;

	for(i=0;i<N;i++){
		zd[i]=-1;
		done[i]=false;
		cost[i]=LLONG_MAX;
	}
	for(i=0;i<K;i++){
		cin>>a;
		a--;
		q.push(Pair(a,-1));
	}
	for(i=0;i<M;i++){
		cin>>a>>b;
		a--;b--;
		load[a].push_back(b);
		load[b].push_back(a);
	}

	while(!q.empty()){
		int qTo=q.front().first;
		int qCost=q.front().second;
		q.pop();
		if(zd[qTo]<0){
			zd[qTo]=qCost+1;
			for(i=0;i<load[qTo].size();i++){
				q.push(Pair(load[qTo][i],zd[qTo]));
			}
		}
	}

	cost[0]=0;
	priority_queue< Pair , vector<Pair> , greater<Pair> > pq;	//cost,town
	pq.push(Pair(cost[0],0));

	int doneTown;
	while(!pq.empty()){
		doneTown=pq.top().second;pq.pop();
		if(done[doneTown]) continue;
		done[doneTown]=true;
		for(i=0;i<load[doneTown].size();i++){
			int toTown=load[doneTown][i];
			if(done[toTown] || zd[toTown]==0) continue;
			int yado=P;
			if(zd[toTown]<=S) yado=Q;
			if(toTown==N-1) yado=0;

			if(cost[doneTown]+yado<cost[toTown]){
				cost[toTown]=cost[doneTown]+yado;
				pq.push(Pair(cost[toTown],toTown));
			}
		}
	}

	cout<<cost[N-1]<<endl;

	return 0;
}