#include <bits/stdc++.h>
class Edge
{
public:
int to;
int next;
};
class Node
{
public:
int idx;
long long dis;
bool operator<(Node const& other) const
{
return other.dis < this->dis;
}
};
Edge edges[500050 * 2];
int heads[500050];
bool visited[500050];
long long dis[500050];
int n, m, k, s, p, q, nodes[500050], signs[500050], u, v;
auto cnt = 0;
void add(int u, int v)
{
edges[++cnt].to = v;
edges[cnt].next = heads[u];
heads[u] = cnt;
}
bool dfs_visited[500050];
void dfs(int now, int depth)
{
if (depth > s)
{
return;
}
dfs_visited[now] = true;
for (auto i = heads[now]; i; i = edges[i].next)
{
if (!dfs_visited[edges[i].to])
{
signs[edges[i].to] = 1;
dfs(edges[i].to, depth + 1);
}
}
}
void dijkstra(int start)
{
for (auto i = 1; i <= n; i++)
{
dis[i] = 1e18;
}
std::priority_queue<Node> q;
dis[start] = 0;
q.push(Node{start, 0});
while (!q.empty())
{
auto now = q.top().idx;
q.pop();
if (visited[now])
{
continue;
}
visited[now] = true;
for (auto i = heads[now]; i; i = edges[i].next)
{
if (signs[edges[i].to] == -1)
{
continue;
}
auto dis1 = (signs[edges[i].to] == 1 ? ::q : p);
if (edges[i].to == n)
{
dis1 = 0;
}
if (dis[edges[i].to] > dis[now] + dis1)
{
dis[edges[i].to] = dis[now] + dis1;
if (!visited[edges[i].to])
{
q.push(Node{edges[i].to, dis[edges[i].to]});
}
}
}
}
}
int main()
{
std::cin >> n >> m >> k >> s;
std::cin >> p >> q;
for (auto i = 1; i <= k; i++)
{
std::cin >> nodes[i];
signs[nodes[i]] = -1;
visited[nodes[i]] = true;
}
for (auto i = 1; i <= m; i++)
{
std::cin >> u >> v;
add(u, v);
add(v, u);
}
for (auto i = 1; i <= k; i++)
{
dfs(nodes[i], 1);
}
dijkstra(1);
std::cout << dis[n] << std::endl;
return 0;
}