#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &s, pair<T, long long int> a) {
  s << a.first << ' ' << a.second;
  return s;
}
long long int st[4 * 1000005];
long long int lz[4 * 1000005];
long long int ara[1000005];
long long int f(long long int l, long long int r) { return max(l, r); }
void propagate(long long int node, long long int ss, long long int sf) {
  if (lz[node] == 0) return;
  st[node] += lz[node];
  if (ss != sf) {
    lz[2 * node] += lz[node];
    lz[2 * node + 1] += lz[node];
  }
  lz[node] = 0;
}
void init(long long int node, long long int ss, long long int sf) {
  if (ss == sf) {
    st[node] = ara[ss];
    return;
  }
  long long int mid = (ss + sf) / 2;
  init(2 * node, ss, mid);
  init(2 * node + 1, mid + 1, sf);
  st[node] = f(st[2 * node], st[2 * node + 1]);
}
void update(long long int node, long long int ss, long long int sf,
            long long int qs, long long int qe, long long int val) {
  propagate(node, ss, sf);
  if (qs > sf || qe < ss || sf < ss) return;
  if (qs <= ss && qe >= sf) {
    lz[node] += val;
    propagate(node, ss, sf);
    return;
  }
  long long int mid = (ss + sf) / 2;
  update(2 * node, ss, mid, qs, qe, val);
  update(2 * node + 1, mid + 1, sf, qs, qe, val);
  st[node] = f(st[2 * node], st[2 * node + 1]);
}
long long int query(long long int node, long long int ss, long long int sf,
                    long long int qs, long long int qe) {
  propagate(node, ss, sf);
  if (qs > sf || qe < ss || sf < ss) return -LLONG_MAX;
  if (qs <= ss && qe >= sf) return st[node];
  long long int mid = (ss + sf) / 2;
  return f(query(2 * node, ss, mid, qs, qe),
           query(2 * node + 1, mid + 1, sf, qs, qe));
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  long long int T = 1;
  for (long long int qq = 1; qq <= T; qq++) {
    long long int n, m, p;
    cin >> n >> m >> p;
    vector<pair<long long int, long long int> > atk(n), def(m);
    vector<pair<pair<long long int, long long int>, long long int> > mon(p);
    for (int i = 0; i < 1000005; i++) ara[i] = -LLONG_MAX;
    for (auto &x : atk) cin >> x.first >> x.second;
    for (auto &x : def)
      cin >> x.first >> x.second, ara[x.first] = max(ara[x.first], -x.second);
    for (auto &x : mon) cin >> x.first.first >> x.first.second >> x.second;
    sort(atk.begin(), atk.end());
    sort(mon.begin(), mon.end());
    init(1, 0, 1000005 - 1);
    long long int ans = -LLONG_MAX;
    long long int l = 0;
    for (int i = 0; i < n; i++) {
      long long int a = -atk[i].second;
      while (l < p && mon[l].first.first < atk[i].first) {
        update(1, 0, 1000005 - 1, mon[l].first.second + 1, 1000005 - 1,
               mon[l].second);
        l++;
      }
      a += query(1, 0, 1000005 - 1, 0, 1000005 - 1);
      ans = max(ans, a);
    }
    cout << ans << endl;
  }
  return 0;
}
