#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class t, class u>
void chmax(t& first, u second) {
  if (first < second) first = second;
}
template <class t, class u>
void chmin(t& first, u second) {
  if (second < first) first = second;
}
template <class t>
using vc = vector<t>;
template <class t>
using vvc = vc<vc<t>>;
using pi = pair<ll, ll>;
using vi = vc<ll>;
template <class t, class u>
ostream& operator<<(ostream& os, const pair<t, u>& p) {
  return os << "{" << p.first << "," << p.second << "}";
}
template <class t>
ostream& operator<<(ostream& os, const vc<t>& v) {
  os << "{";
  for (auto e : v) os << e << ",";
  return os << "}";
}
const ll inf = LLONG_MAX / 3;
template <class d>
struct maxflow {
  struct E {
    ll to, rev;
    d cap;
  };
  vvc<E> g;
  vi itr, lv;
  maxflow(ll n) : g(n), itr(n), lv(n) {}
  void ae(ll s, ll t, d c) {
    g[s].push_back({t, (ll)g[t].size(), c});
    g[t].push_back({s, (ll)g[s].size() - 1, 0});
  }
  void bfs(ll s) {
    fill(lv.begin(), lv.end(), -1);
    lv[s] = 0;
    queue<ll> q;
    q.push(s);
    while (q.size()) {
      ll v = q.front();
      q.pop();
      for (auto e : g[v])
        if (e.cap > 0 && lv[e.to] == -1) {
          lv[e.to] = lv[v] + 1;
          q.push(e.to);
        }
    }
  }
  d dfs(ll v, ll t, d f) {
    if (v == t) return f;
    d res = 0;
    for (ll& i = itr[v]; i < (ll)g[v].size(); i++) {
      E& e = g[v][i];
      if (e.cap > 0 && lv[e.to] == lv[v] + 1) {
        d first = dfs(e.to, t, min(f, e.cap));
        if (first > 0) {
          e.cap -= first;
          g[e.to][e.rev].cap += first;
          res += first;
          f -= first;
          if (f <= 0) break;
        }
      }
    }
    return res;
  }
  d calc(ll s, ll t) {
    d f = 0;
    while (1) {
      bfs(s);
      if (lv[t] == -1) return f;
      fill(itr.begin(), itr.end(), 0);
      f += dfs(s, t, 1e9);
    }
  }
};
void sub(vi pro, ll k) {
  ll n = pro.size();
  vi iso(n, 1);
  vc<pi> es;
  for (ll _ = ll(0); _ < ll(k); _++) {
    ll first, second;
    cin >> first >> second;
    first--;
    second--;
    es.emplace_back(first, second);
    iso[first] = 0;
    iso[second] = 0;
  }
  ll base = 0;
  vi idx;
  for (ll i = ll(0); i < ll(n); i++)
    if (iso[i]) {
      base += max(ll(0), pro[i]);
    } else {
      idx.push_back(i);
    }
  ll s = idx.size();
  maxflow<ll> mcf(1 + s + 1);
  for (ll i = ll(0); i < ll(s); i++) {
    if (pro[idx[i]] > 0) {
      base += pro[idx[i]];
      mcf.ae(0, 1 + i, pro[idx[i]]);
    } else {
      mcf.ae(1 + i, 1 + s, -pro[idx[i]]);
    }
  }
  for (auto e : es) {
    ll first = lower_bound(idx.begin(), idx.end(), e.first) - idx.begin();
    ll second = lower_bound(idx.begin(), idx.end(), e.second) - idx.begin();
    mcf.ae(1 + first, 1 + second, inf);
  }
  cout << base - mcf.calc(0, 1 + s) << endl;
}
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout << fixed << setprecision(20);
  ll n, m;
  cin >> n >> m;
  vvc<ll> dist(n, vi(n, inf));
  for (ll i = ll(0); i < ll(n); i++) dist[i][i] = 0;
  for (ll _ = ll(0); _ < ll(m); _++) {
    ll first, second;
    cin >> first >> second;
    first--;
    second--;
    dist[first][second] = 1;
    dist[second][first] = 1;
  }
  for (ll k = ll(0); k < ll(n); k++)
    for (ll i = ll(0); i < ll(n); i++)
      for (ll j = ll(0); j < ll(n); j++)
        chmin(dist[i][j], dist[i][k] + dist[k][j]);
  ll s, second, k;
  cin >> s >> second >> k;
  vc<tuple<ll, ll, ll, ll>> xafp;
  for (ll i = ll(0); i < ll(s); i++) {
    ll x, first, f, p;
    cin >> x >> first >> f >> p;
    x--;
    xafp.emplace_back(x, first, f, p);
  }
  vc<tuple<ll, ll, ll>> xdg;
  for (ll i = ll(0); i < ll(second); i++) {
    ll x, d, g;
    cin >> x >> d >> g;
    x--;
    xdg.emplace_back(x, d, g);
  }
  vc<pi> ord;
  for (ll i = ll(0); i < ll(s); i++)
    ord.emplace_back(get<1>(xafp[i]), second + i);
  for (ll i = ll(0); i < ll(second); i++) ord.emplace_back(get<1>(xdg[i]), i);
  vi pro(s);
  vi mxg(n, -inf);
  sort(ord.begin(), ord.end());
  for (auto kv : ord) {
    ll i = kv.second;
    if (i < second) {
      chmax(mxg[get<0>(xdg[i])], get<2>(xdg[i]));
    } else {
      i -= second;
      ll x, first, f, p;
      tie(x, first, f, p) = xafp[i];
      ll mx = -inf;
      for (ll j = ll(0); j < ll(n); j++)
        if (dist[x][j] <= f) chmax(mx, mxg[j]);
      pro[i] = mx - p;
    }
  }
  sub(pro, k);
}
