#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
template <class S>
inline void read(S& arg) {
  cin >> arg;
}
template <class S>
inline void readA(S Lptr, S Rptr) {
  while (Lptr != Rptr) {
    read(*Lptr);
    Lptr++;
  }
}
template <class S, class... T>
inline void read(S& arg, T&... rest) {
  read(arg);
  read(rest...);
}
char delimiter = ' ';
template <class S>
inline void write(S arg) {
  cout << arg << '\n';
}
template <class S, class... T>
inline void write(S arg, T... rest) {
  cout << arg << delimiter;
  write(rest...);
}
template <class S>
inline void writeA(S Lptr, S Rptr) {
  while (Lptr != Rptr) {
    cout << *Lptr;
    Lptr++;
    if (Lptr != Rptr) cout << delimiter;
  }
  cout << '\n';
}
template <class T, class S>
inline bool smin(T& a, S b) {
  return (T)b < a ? a = b, 1 : 0;
}
template <class T, class S>
inline bool smax(T& a, S b) {
  return a < (T)b ? a = b, 1 : 0;
}
constexpr int MOD = 998244353;
constexpr int N = 4e3 + 10;
template <typename T>
inline T mod(T& v) {
  return v = (v % MOD + MOD) % MOD;
}
template <typename T>
inline long long dom(T v) {
  return (v % MOD + MOD) % MOD;
}
template <typename S, typename T>
inline S add(S& l, T r) {
  return mod(l += r);
}
long long po(long long v, long long u) {
  return u ? po(v * v % MOD, u >> 1) * (u & 1 ? v : 1) % MOD : 1;
}
int n, m, d[110][110];
long long s, b, k, h, x[N], a[N], f[N], D[N], y[N];
vector<int> adj[N];
bitset<N> match, mark;
int p[N];
bool dfs(int v) {
  mark[v] = true;
  for (auto e : adj[v])
    if (!match[e] || (!mark[p[e]] && dfs(p[e]))) {
      match[e] = true;
      match[v] = true;
      p[v] = e;
      p[e] = v;
      return true;
    }
  return false;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  memset(d, 63, sizeof(d));
  read(n, m);
  for (int i = 1; i < (int)n + 1; i++) d[i][i] = 0;
  for (int i = 0; i < (int)m; i++) {
    int u, v;
    read(u, v);
    d[u][v] = d[v][u] = 1;
  }
  for (int K = 1; K < (int)n + 1; K++)
    for (int i = 1; i < (int)n + 1; i++)
      for (int j = 1; j < (int)n + 1; j++) smin(d[i][j], d[i][K] + d[K][j]);
  read(s, b, k, h);
  for (int i = 0; i < (int)s; i++) read(x[i], a[i], f[i]);
  for (int i = 0; i < (int)b; i++) read(y[i], D[i]);
  for (int i = 0; i < (int)s; i++)
    for (int j = 0; j < (int)b; j++)
      if (d[x[i]][y[j]] <= f[i] && a[i] >= D[j]) adj[i].push_back(s + j);
  int cnt = 0;
  while (true) {
    bool cn = false;
    mark.reset();
    for (int i = 0; i < (int)s; i++)
      if (!match[i] && !mark[i] && dfs(i)) {
        cn = true;
        cnt++;
      }
    if (!cn) break;
  }
  long long res = cnt * k;
  for (int i = 0; i < (int)cnt + 1; i++)
    smin(res, (s - cnt + i) * h + (cnt - i) * k);
  cout << res << endl;
  return 0;
}
