#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int ns;
vector<vector<int>> Adj(100, vector<int>(100, inf));
vector<vector<int>> att, def;
vector<vector<int>> c, cap;
vector<vector<int>> adj;
int s = 0, t = 1;
vector<int> p;
int bfs() {
  queue<pair<int, int>> q;
  p = vector<int>(ns, -1);
  p[s] = -2;
  q.push({s, inf});
  while (!q.empty()) {
    int u, f;
    tie(u, f) = q.front();
    q.pop();
    for (int v : adj[u]) {
      if (p[v] == -1 and c[u][v]) {
        p[v] = u;
        int nf = min(f, c[u][v]);
        if (v == t) return nf;
        q.push({v, nf});
      }
    }
  }
  return 0;
}
int max_flow() {
  int flow = 0, new_flow;
  c = cap;
  while (new_flow = bfs()) {
    int cur = t;
    while (cur != s) {
      int prev = p[cur];
      c[cur][prev] += new_flow;
      c[prev][cur] -= new_flow;
      cur = prev;
    }
    flow += new_flow;
  }
  return flow;
}
int n;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int m;
  cin >> n >> m;
  while (m--) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    Adj[u][v] = Adj[v][u] = 1;
  }
  for (int i = 0; i < n; ++i) Adj[i][i] = 0;
  for (int k = 0; k < n; ++k)
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < n; ++j)
        if (Adj[i][j] > Adj[i][k] + Adj[k][j])
          Adj[i][j] = Adj[i][k] + Adj[k][j];
  int s, b, k, h;
  cin >> s >> b >> k >> h;
  att = vector<vector<int>>(s);
  def = vector<vector<int>>(b);
  for (int i = 0; i < s; ++i) {
    int x, a, f;
    cin >> x >> a >> f;
    --x;
    att[i].push_back(x);
    att[i].push_back(a);
    att[i].push_back(f);
  }
  for (int i = 0; i < b; ++i) {
    int x, d;
    cin >> x >> d;
    --x;
    def[i].push_back(x);
    def[i].push_back(d);
  }
  ns = s + b + 5;
  adj = vector<vector<int>>(ns);
  cap = vector<vector<int>>(ns, vector<int>(ns, 0));
  for (int i = 0; i < s; ++i)
    for (int j = 0; j < b; ++j)
      if (Adj[def[j][0]][att[i][0]] <= att[i][2] and att[i][1] >= def[j][1]) {
        int x = 3 + i, y = 4 + s + j;
        adj[x].push_back(y);
        adj[y].push_back(x);
        cap[x][y] = 1;
      }
  for (int i = 0; i < s; ++i) {
    int x = 3 + i;
    adj[x].push_back(0);
    adj[0].push_back(x);
    cap[0][x] = 1;
  }
  for (int i = 0; i < b; ++i) {
    int y = 4 + s + i;
    adj[y].push_back(1);
    adj[1].push_back(y);
    cap[y][1] = 1;
  }
  cout << min((long long)max_flow() * k, (long long)s * h) << '\n';
}
