#include <bits/stdc++.h>
using namespace std;
mt19937 rng(std::chrono::system_clock::now().time_since_epoch().count());
const int N = 1000;
int n, m, dis[N][N], rem, s, b, k, h, x[N], a[N], f[N], x1[N], d[N],
    last[2 * N + 2], last1[2 * N + 2], cost[2 * N + 2], q[2 * N + 2];
struct edge {
  int u, v, c, last;
} e[3 * N * N];
void addEdge(int u, int v) {
  e[rem].u = u;
  e[rem].v = v;
  e[rem].c = 1;
  e[rem].last = last[u];
  last[u] = rem++;
  e[rem].u = v;
  e[rem].v = u;
  e[rem].c = 0;
  e[rem].last = last[v];
  last[v] = rem++;
}
bool getPath() {
  memset(cost, -1, sizeof cost);
  cost[0] = 0;
  int l = 0, r = 0;
  while (l <= r) {
    int x = q[l++];
    for (int cur = last[x]; cur != -1; cur = e[cur].last)
      if (e[cur].c && cost[e[cur].v] == -1) {
        cost[e[cur].v] = cost[x] + 1;
        q[++r] = e[cur].v;
      }
  }
  return cost[s + b + 1] != -1;
}
bool dfs(int u) {
  if (u == s + b + 1) return 1;
  for (int &cur = last1[u]; cur != -1; cur = e[cur].last) {
    if (e[cur].c && cost[e[cur].v] == cost[u] + 1 && dfs(e[cur].v)) {
      e[cur].c = 0;
      e[cur ^ 1].c = 1;
      return 1;
    }
  }
  return 0;
}
int Maxflow() {
  int flow = 0;
  while (getPath()) {
    for (int i = 0; i < 2 * N + 2; i++) last1[i] = last[i];
    while (dfs(0)) flow++;
  }
  return flow;
}
int main() {
  scanf("%d%d", &n, &m);
  memset(last, -1, sizeof last);
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      if (i != j) dis[i][j] = 1e9;
  for (int i = 0, a, b; i < m; i++) {
    scanf("%d%d", &a, &b);
    dis[a - 1][b - 1] = dis[b - 1][a - 1] = 1;
  }
  for (int k = 0; k < n; k++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  scanf("%d%d%d%d", &s, &b, &k, &h);
  for (int i = 0; i < s; i++) {
    addEdge(0, i + 1);
    scanf("%d%d%d", x + i, a + i, f + i);
  }
  for (int i = 0; i < b; i++) {
    addEdge(s + i + 1, s + b + 1);
    scanf("%d%d", x1 + i, d + i);
    for (int j = 0; j < s; j++)
      if (dis[x[j] - 1][x1[i] - 1] <= f[j] && a[j] >= d[i])
        addEdge(j + 1, i + s + 1);
  }
  printf("%lld\n", min(Maxflow() * 1LL * k, h * 1LL * s));
}
