#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << endl; }
template <class T>
ostream& prnt(ostream& out, T v) {
  out << v.size() << '\n';
  for (auto e : v) out << e << ' ';
  return out;
}
template <class T>
ostream& operator<<(ostream& out, vector<T> v) {
  return prnt(out, v);
}
template <class T>
ostream& operator<<(ostream& out, set<T> v) {
  return prnt(out, v);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, map<T1, T2> v) {
  return prnt(out, v);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> p) {
  return out << '(' << p.first << ' ' << p.second << ')';
}
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << H;
  debug_out(T...);
}
struct Flow {
  const static int MAX_EDGES = 2510005;
  const static int MAX_NODES = 6105;
  const int INF = 1e9 + 50;
  int S = MAX_NODES - 2, D = MAX_NODES - 1;
  int G[MAX_NODES];
  struct Edge {
    int vec, flow, cap, cost, rev, nxt;
  };
  Edge E[MAX_EDGES];
  int edges = 0;
  int ParentNode[MAX_NODES], ParentEdge[MAX_NODES], Dist[MAX_NODES];
  bool InQ[MAX_NODES];
  queue<int> Q;
  Flow() { Reset(); }
  void setSource(int s) { S = s; }
  void setSink(int d) { D = d; }
  void _addEdge(int a, int b, int cap, int cost, int rev) {
    ++edges;
    E[edges] = (Edge){b, 0, cap, cost, rev, G[a]};
    G[a] = edges;
  }
  void AddEdge(int a, int b, int cap, int cost) {
    _addEdge(a, b, cap, cost, edges + 2);
    _addEdge(b, a, 0, -cost, edges);
  }
  bool Bellman() {
    memset(ParentNode, 0, sizeof(ParentNode));
    Dist[S] = 0;
    Q.push(S);
    while (!Q.empty()) {
      int top = Q.front();
      InQ[top] = 0;
      Q.pop();
      for (int i = G[top]; i; i = E[i].nxt) {
        int vec = E[i].vec;
        if (E[i].flow < E[i].cap &&
            (ParentNode[vec] == 0 || Dist[vec] > Dist[top] + E[i].cost)) {
          Dist[vec] = Dist[top] + E[i].cost;
          ParentNode[vec] = top;
          ParentEdge[vec] = i;
          if (!InQ[vec]) {
            Q.push(vec);
            InQ[vec] = 1;
          }
        }
      }
    }
    return ParentNode[D] != 0;
  }
  void Reset() {
    edges = 0;
    memset(G, 0, sizeof(G));
  }
  int MFMC() {
    int cost = 0, flow = 0;
    while (Bellman()) {
      int M = INF;
      for (int node = D; node != S; node = ParentNode[node]) {
        int ei = ParentEdge[node];
        M = min(M, E[ei].cap - E[ei].flow);
      }
      for (int node = D; node != S; node = ParentNode[node]) {
        int ei = ParentEdge[node], ri = E[ei].rev;
        E[ei].flow += M;
        E[ri].flow -= M;
        cost += E[ei].cost * M;
      }
      flow += M;
    }
    cerr << "flow"
         << " ->",
        debug_out(flow);
    return cost;
  }
};
Flow F;
const int MAX_DAY = 101;
int n, m, k, c, d, a[55], x, y;
int vert(int nr, int day) { return 51 * day + nr; }
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m >> k >> c >> d;
  for (int i = 1; i <= k; i++) {
    cin >> a[i];
    F.AddEdge(F.S, vert(a[i], 0), 1, 0);
  }
  for (int i = 1; i <= m; i++) {
    cin >> x >> y;
    for (int day = 0; day < MAX_DAY; day++) {
      for (int cost = 0; cost < 50; cost++) {
        F.AddEdge(vert(x, day), vert(y, day + 1), 1, (2 * cost + 1) * d);
        F.AddEdge(vert(y, day), vert(x, day + 1), 1, (2 * cost + 1) * d);
      }
    }
  }
  for (int day = 0; day <= MAX_DAY; day++) {
    for (int i = 1; i <= n; i++)
      F.AddEdge(vert(i, day), vert(i, day + 1), 51, 0);
    for (int i = 0; i < k; i++) F.AddEdge(vert(1, day), F.D, 1, c * day);
  }
  cout << F.MFMC() << '\n';
}
