
#include <cstdio>
#include <utility>
#include <vector>
#include <queue>
#include <functional>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;

const ll inf = 1e18;

ll n, m, k, s;
ll p, q;
ll c[123456];
vector<pll>ab;

struct edge { ll to, cost; };

ll dist[123456];
void dijkstra(vector<edge>graph[],ll start)
{
	fill(dist, dist + 123456, inf);
	dist[start] = 0;
	priority_queue<pll,vector<pll>,greater<pll>> que;
	que.push({ 0, start });
	while (!que.empty())
	{
		pll par = que.top(); que.pop();
		ll pass = par.first;
		ll vecid = par.second;
		if (dist[vecid] < pass)continue;
		for (auto ed : graph[vecid])
		{
			if (pass + ed.cost < dist[ed.to])
			{
				dist[ed.to] = pass + ed.cost;
				que.push({ dist[ed.to],ed.to });
			}
		}
	}
}

vector<edge>zombgr[123456];
vector<edge>truegr[123456];

int main()
{
	scanf("%lld %lld %lld %lld", &n, &m, &k, &s);
	scanf("%lld %lld", &p, &q);
	for (ll i = 0; i < k; ++i)
	{
		scanf("%lld", c + i);
		zombgr[0].push_back({ c[i],0 });
	}
	for (ll j = 0;j < m;++j)
	{
		ll a, b;
		scanf("%lld %lld", &a, &b);
		ab.emplace_back(a, b);
		zombgr[a].push_back({ b,1 });
		zombgr[b].push_back({ a,1 });
	}
	dijkstra(zombgr, 0);
	ll distn = dist[n];
	for (auto ed : ab)
	{
		ll a = ed.first, b = ed.second;
		if (dist[a] && dist[b])
		{
			if (b == n)
			{
				truegr[a].push_back({ b,0 });
				truegr[b].push_back({ a,(dist[a] <= s) ? q : p });
			}
			else
			{
				truegr[a].push_back({ b,(dist[b] <= s) ? q : p });
				truegr[b].push_back({ a,(dist[a] <= s) ? q : p });
			}
		}
	}
	dijkstra(truegr, 1);
	printf("%lld\n", dist[n]);
	return 0;
}