#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
const int INF = 0x3f3f3f3f;
const int N = 1e2 + 10, Node = 2e3 + 10, Edge = Node * Node / 2;
int Dis[N][N], p[Node], a[Node], f[Node];
int to[Edge], nex[Edge], beg[Node], flow[Edge], dis[Node], cur[Node];
int S, T, e = 1;
inline int read() {
  int x = 0, flag = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-') ch = getchar();
  if (ch == '-') flag = -1, ch = getchar();
  while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch - '0'), ch = getchar();
  return x * flag;
}
inline void add(int x, int y, int z) {
  to[++e] = y, nex[e] = beg[x], beg[x] = e, flow[e] = z;
  to[++e] = x, nex[e] = beg[y], beg[y] = e, flow[e] = 0;
}
inline bool bfs() {
  queue<int> q;
  memset(dis, 0, sizeof(dis));
  dis[S] = 1;
  q.push(S);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = beg[x]; i; i = nex[i])
      if (flow[i] && !dis[to[i]]) dis[to[i]] = dis[x] + 1, q.push(to[i]);
  }
  return dis[T];
}
inline int dfs(int x, int f) {
  if (x == T) return f;
  int res = f;
  for (int &i = cur[x]; i; i = nex[i])
    if (flow[i] && dis[to[i]] == dis[x] + 1) {
      int v = dfs(to[i], min(f, flow[i]));
      flow[i] -= v, flow[i ^ 1] += v, f -= v;
      if (!f) return res;
    }
  return res - f;
}
int main() {
  int n = read(), m = read();
  memset(dis, 63, sizeof(dis));
  for (int i = (1), iend = (m); i <= iend; i++) {
    int u = read(), v = read();
    Dis[u][v] = Dis[v][u] = 1;
  }
  for (int i = (1), iend = (n); i <= iend; i++) Dis[i][i] = 0;
  for (int k = (1), kend = (n); k <= kend; k++)
    for (int i = (1), iend = (n); i <= iend; i++)
      for (int j = (1), jend = (n); j <= jend; j++)
        chkmin(Dis[i][j], Dis[i][k] + Dis[k][j]);
  int A = read(), B = read(), k = read(), h = read();
  S = A + B + 1, T = A + B + 2;
  for (int i = (1), iend = (A); i <= iend; i++)
    p[i] = read(), a[i] = read(), f[i] = read(), add(S, i, 1);
  for (int i = (1), iend = (B); i <= iend; i++) {
    add(i + A, T, 1);
    int x = read(), d = read();
    for (int j = (1), jend = (A); j <= jend; j++)
      if (Dis[p[j]][x] <= f[j] && a[j] >= d) add(j, i + A, 1);
  }
  int ans = 0;
  while (bfs()) {
    memcpy(cur, beg, sizeof(cur));
    ans += dfs(S, 1e9);
  }
  long long Ans = 1e18;
  for (int i = (0), iend = (A); i <= iend; i++)
    chkmin(Ans, 1ll * k * min(A - i, ans) + 1ll * i * h);
  printf("%lld\n", Ans);
  return 0;
}
