#include <bits/stdc++.h>
using namespace std;
const int inf = 1 << 29;
int d[110][110];
int x[1010], a[1010], f[1010], y[1010], c[1010];
struct E {
  int to, cap, rev;
};
vector<E> e[3010];
void add_edge(int fr, int to, int cap) {
  e[fr].push_back((E){to, cap, (int)e[to].size()});
  e[to].push_back((E){fr, 0, (int)e[fr].size() - 1});
}
int q[3010], qs, qe, di[3010];
int bfs(int so, int si) {
  for (int i = 0; i <= si; i++) {
    di[i] = inf;
  }
  di[so] = 0;
  qs = qe = 0;
  q[qe++] = so;
  while (qs < qe) {
    int v = q[qs++];
    for (int i = 0; i < e[v].size(); i++) {
      int w = e[v][i].to;
      if (e[v][i].cap <= 0 || di[w] != inf) continue;
      di[w] = di[v] + 1;
      q[qe++] = w;
    }
  }
  return di[si] == inf;
}
int it[3010];
int dfs(int v, int si, int fl) {
  if (v == si) return fl;
  for (int &i = it[v]; i < e[v].size(); i++) {
    E &ed = e[v][i];
    int w = ed.to;
    if (ed.cap <= 0 || di[w] != di[v] + 1) {
      continue;
    }
    int t = dfs(w, si, min(fl, ed.cap));
    if (t > 0) {
      ed.cap -= t;
      e[w][ed.rev].cap += t;
      return t;
    }
  }
  return 0;
}
long long ans;
int flow(int so, int si) {
  int res = 0, fl;
  for (;;) {
    if (bfs(so, si)) return res;
    for (int i = 0; i <= si; i++) {
      it[i] = 0;
    }
    fl = 1;
    while (fl) {
      fl = dfs(so, si, inf);
      res += fl;
    }
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      d[i][j] = i == j ? 0 : inf;
    }
  }
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    --u;
    --v;
    d[u][v] = d[v][u] = 1;
  }
  for (int k = 0; k < n; k++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        d[i][j] = min(d[i][k] + d[k][j], d[i][j]);
      }
    }
  }
  int s, b, k, h;
  scanf("%d%d%d%d", &s, &b, &k, &h);
  int so = s + b, si = so + 1;
  for (int i = 0; i < s; i++) {
    scanf("%d%d%d", &x[i], &a[i], &f[i]);
    --x[i];
    add_edge(so, i, 1);
  }
  for (int i = 0; i < b; i++) {
    scanf("%d%d", &y[i], &c[i]);
    --y[i];
    add_edge(i + s, si, 1);
  }
  for (int i = 0; i < s; i++) {
    for (int j = 0; j < b; j++) {
      if (d[x[i]][y[j]] <= f[i] && a[i] >= c[j]) {
        add_edge(i, s + j, 1);
      }
    }
  }
  ans = (long long)h * s;
  int p = flow(so, si);
  for (int i = 0; i < s; i++) {
    long long tmp = (long long)i * h + (long long)k * (p - max(p + i - s, 0));
    ans = min(ans, tmp);
  }
  printf("%I64d\n", ans);
  return 0;
}
