#include <bits/stdc++.h>
using namespace std;
const int N = 3000;
vector<int> g[N];
int n;
int mt[N], mt2[N], ds[N];
bool bfs() {
  queue<int> q;
  memset(ds, -1, sizeof(ds));
  for (int i = 0; i < n; i++)
    if (mt2[i] < 0) ds[i] = 0, q.push(i);
  bool r = false;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int y : g[x]) {
      if (mt[y] >= 0 && ds[mt[y]] < 0)
        ds[mt[y]] = ds[x] + 1, q.push(mt[y]);
      else if (mt[y] < 0)
        r = true;
    }
  }
  return r;
}
bool dfs(int x) {
  for (int y : g[x])
    if (mt[y] < 0 || ds[mt[y]] == ds[x] + 1 && dfs(mt[y])) {
      mt[y] = x;
      mt2[x] = y;
      return true;
    }
  ds[x] = 1 << 30;
  return false;
}
int mm(int x) {
  int r = 0;
  memset(mt, -1, sizeof(mt));
  memset(mt2, -1, sizeof(mt2));
  n = x;
  while (bfs()) {
    for (int i = 0; i < n; i++)
      if (mt2[i] < 0) r += dfs(i);
  }
  return r;
}
int a[N][N];
void floyd(int n) {
  for (int k = 0; k < n; k++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (i != j) a[i][j] = 1e9;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    if (u != v) a[u][v] = a[v][u] = 1;
  }
  floyd(n);
  long long s, b, k, h;
  cin >> s >> b >> k >> h;
  vector<vector<int>> ships, bases;
  for (int i = 0; i < s; i++) {
    int x, a, f;
    cin >> x >> a >> f;
    ships.push_back({x, a, f});
  }
  for (int i = 0; i < b; i++) {
    int x, d;
    cin >> x >> d;
    bases.push_back({x, d});
  }
  for (int i = 0; i < s; i++)
    for (int j = 0; j < b; j++) {
      if (ships[i][1] >= bases[j][1] &&
          ships[i][2] >= a[ships[i][0]][bases[j][0]]) {
        g[i].push_back(j);
      }
    }
  long long c1 = mm(s) * k;
  long long c2 = s * h;
  cout << min(c1, c2) << endl;
  return 0;
}
