#include <bits/stdc++.h>
using namespace std;
struct node {
  long long v, lazy, s, e;
  node *l, *r;
  node(long long ss, long long ee) {
    s = ss;
    e = ee;
    v = lazy = 0;
    if (ss == ee) {
      l = r = NULL;
    } else {
      l = new node(s, (s + e) / 2);
      r = new node((s + e) / 2 + 1, e);
    }
  }
  void update(long long a, long long b, long long inc) {
    if (a <= s && e <= b) {
      lazy += inc;
      v += inc;
      return;
    }
    l->lazy += lazy;
    l->v += lazy;
    r->lazy += lazy;
    r->v += lazy;
    lazy = 0;
    if (a <= (s + e) / 2) l->update(a, b, inc);
    if ((s + e) / 2 < b) r->update(a, b, inc);
    v = max(l->v, r->v);
  }
} * root;
vector<pair<long long, long long> > w, s;
pair<long long, long long> ww[200005];
pair<pair<long long, long long>, long long> mons[200005];
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  root = new node(0, 1000005);
  long long n, m, p, nex = 0, ans = LLONG_MIN;
  cin >> n >> m >> p;
  for (long long x = 0; x < n; x++) {
    cin >> ww[x].first >> ww[x].second;
  }
  sort(ww, ww + n);
  for (long long x = 0; x < n; x++) {
    while (w.size() > 0 && w.back().second > ww[x].second) {
      w.pop_back();
    }
    if (w.size() == 0 || w.back().first < ww[x].first) w.push_back(ww[x]);
  }
  n = w.size();
  for (long long x = 0; x < m; x++) {
    cin >> ww[x].first >> ww[x].second;
  }
  sort(ww, ww + m);
  for (long long x = 0; x < m; x++) {
    while (s.size() > 0 && s.back().second > ww[x].second) {
      s.pop_back();
    }
    if (s.size() == 0 || s.back().first < ww[x].first) s.push_back(ww[x]);
  }
  m = s.size();
  ans = -w[0].second - s[0].second;
  for (long long x = 0; x < m; x++) {
    if (x == 0)
      root->update(0, s[x].first, -s[x].second);
    else
      root->update(s[x - 1].first + 1, s[x].first, -s[x].second);
  }
  root->update(s[m - 1].first + 1, 1000005, LLONG_MIN);
  for (long long x = 0; x < p; x++) {
    cin >> mons[x].first.first >> mons[x].first.second >> mons[x].second;
  }
  sort(mons, mons + p);
  long long cost = 0, cur_val = 0;
  nex = 0;
  for (long long x = 0; x < p; x++) {
    while (mons[x].first.first >= cur_val && nex < n) {
      cur_val = w[nex].first;
      cost = w[nex].second;
      nex++;
    }
    if (mons[x].first.first >= cur_val) break;
    root->update(mons[x].first.second + 1, 1000005, mons[x].second);
    ans = max(ans, root->v - cost);
  }
  cout << ans << '\n';
  return 0;
}
