#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx")
#define all(x) (x).begin(),(x).end()
#define rep(i,n) for(int (i)=0;i<(n);i++)
#define rrep(i,n) for(int (i)=1;i<=(n);i++)
#define REP(i,m,n) for(int (i)=(m);(i)<(n);(i)++)
#define MOD 1000000007
#define INF 1e18
#define int long long
#define endl "\n"
#define yorn(f) puts((f)?"Yes":"No")
#define YORN(f) puts((f)?"YES":"NO")
typedef long long ll;
typedef pair<int, int> P;
int gcd(int a,int b){return b?gcd(b,a%b):a;};
int lcm(int a,int b){return a/gcd(a,b)*b;};
int mod(int a,int b){return (a+b-1)/b;};
template<typename A, size_t N, typename T>
void Fill(A(&array)[N],const T &val){std::fill((T*)array,(T*)(array+N),val);}
template<class T>inline bool chmax(T& a,T b){if(a<b){a=b;return true;}return false;};
template<class T>inline bool chmin(T& a,T b){if(a>b){a=b;return true;}return false;};

int n, m, k, s;
int p, q;
int c[100010]; // ゾンビがいる島
vector<int> roads[100010];
vector<P> g[100010];

void set_graph(int st) { // BFSで有向グラフを作る
	vector<int> dist(n+1, -1), came(n+1, 0);
	queue<int> que;
	que.push(st);
	dist[st] = 0;

	while(!que.empty()) {
		int cur = que.front();
		que.pop();
		if(came[cur]) continue;
		//cout << cur << ": ";
		for(auto &x : roads[cur]) {
			if(dist[x] == -1) dist[x] = dist[cur] + 1;
			que.push(x);
			//cout << x << " ";
			if(dist[cur] == 1) continue; // ゾンビがいる場合
			int setcost;
			if(cur == n-1) setcost = 0;
			else if(dist[cur] <= s) setcost = q;
			else setcost = p;
			g[x].push_back(P(setcost, cur));
		}
		//cout << endl;
		came[cur] = 1;
	}
	// rep(i, n) cout << dist[i] << " ";
	// cout << endl;
}

int dijkstra(int st, int ed) {
	// first: cost, second: to
	priority_queue<P, vector<P>, greater<P>> que;
	vector<int> dist(n+1, INF);
	dist[st] = 0;
	que.push(P(0, st));

	while(!que.empty()) {
		P cur = que.top();
		que.pop();
		int next = cur.second;
		if(dist[next] < cur.first) continue;
		for(auto e : g[next]) {
			if(dist[next] + e.first < dist[e.second]) {
				dist[e.second] = dist[next] + e.first;
				que.push(P(dist[e.second], e.second));
			}
		}
	}
	// rep(i, n) cout << dist[i] << " ";
	// cout << endl;
	return dist[ed];
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);
	//cout << fixed << setprecision(15);
	
	cin >> n >> m >> k >> s;
	cin >> p >> q;
	rep(i, k) {
		cin >> c[i];
		c[i]--;
		roads[n].push_back(c[i]);
	}
	rep(i, m) {
		int u, v;
		cin >> u >> v;
		u--; v--;
		roads[u].push_back(v);
		roads[v].push_back(u);
	}
	s++;
	set_graph(n);

	// rep(i, n) {
	// 	cout << i << ": ";
	// 	for(auto &x : g[i]) cout << "{" << x.second << ", " << x.first << "}, ";
	// 	cout << endl;
	// }
	int ans = dijkstra(0, n-1);
	cout << ans << endl;
	return 0;
}

