#include <bits/stdc++.h>
using namespace std;
void bfs(int v, vector<vector<int> > &graf, vector<vector<int> > &dist) {
  queue<int> q;
  q.push(v);
  while (!q.empty()) {
    int p = q.front();
    q.pop();
    for (int i = 0; i < graf[p].size(); i++) {
      int to = graf[p][i];
      if (dist[v][to] != 1e9) continue;
      dist[v][to] = dist[v][p] + 1;
      q.push(to);
    }
  }
}
struct ship {
  int pos, attack, fuel;
};
struct base {
  int pos, def;
};
vector<bool> used;
vector<int> lnk;
bool dfs(int v, vector<vector<int> > &vv) {
  used[v] = 1;
  for (int i = 0; i < vv[v].size(); i++) {
    int u = vv[v][i];
    if (lnk[u] == -1 || !used[lnk[u]] && dfs(lnk[u], vv)) {
      lnk[u] = v;
      return true;
    }
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m;
  cin >> n >> m;
  vector<vector<int> > dist(n + 1, vector<int>(n + 1, 1e9));
  vector<vector<int> > graf(n + 1);
  for (int i = 0; i < m; i++) {
    int first, t;
    cin >> first >> t;
    graf[first].push_back(t);
    graf[t].push_back(first);
  }
  for (int i = 1; i <= n; i++) dist[i][i] = 0;
  for (int i = 1; i <= n; i++) bfs(i, graf, dist);
  int second, b, k, h;
  cin >> second >> b >> k >> h;
  vector<ship> ships(second);
  for (int i = 0; i < second; i++) {
    cin >> ships[i].pos >> ships[i].attack >> ships[i].fuel;
  }
  vector<base> bases(b);
  for (int i = 0; i < b; i++) {
    cin >> bases[i].pos >> bases[i].def;
  }
  vector<vector<int> > vv(second);
  for (int i = 0; i < second; i++) {
    for (int j = 0; j < b; j++) {
      int d = dist[ships[i].pos][bases[j].pos];
      if (d <= ships[i].fuel && bases[j].def <= ships[i].attack)
        vv[i].push_back(j);
    }
  }
  int ans = 0;
  used.resize(second);
  lnk.resize(b, -1);
  for (int i = 0; i < second; i++) {
    used.assign(n, 0);
    if (dfs(i, vv)) ans++;
  }
  cout << min(1LL * ans * k, 1LL * second * h);
}
