#include <bits/stdc++.h>
using namespace std;
int n, m, p;
pair<long long, long long> a[200005], b[200005];
vector<tuple<long long, long long, long long> > mons;
long long st[4 * 1000005];
long long lz[4 * 1000005];
long long ara[1000005];
long long first(long long l, long long r) { return max(l, r); }
struct info {
  long long prop, MAX;
} tree[1000005 * 3];
void init(long long node, long long b, long long e) {
  if (b == e) {
    tree[node].MAX = ara[b];
    tree[node].prop = 0;
    return;
  }
  long long Left = node * 2;
  long long Right = node * 2 + 1;
  long long mid = (b + e) / 2;
  init(Left, b, mid);
  init(Right, mid + 1, e);
  tree[node].MAX = max(tree[Left].MAX, tree[Right].MAX);
}
void update(long long node, long long b, long long e, long long i, long long j,
            long long x) {
  if (i > e || j < b) return;
  if (b >= i && e <= j) {
    tree[node].MAX += x;
    tree[node].prop += x;
    return;
  }
  long long Left = node * 2;
  long long Right = (node * 2) + 1;
  long long mid = (b + e) / 2;
  update(Left, b, mid, i, j, x);
  update(Right, mid + 1, e, i, j, x);
  tree[node].MAX = max(tree[Left].MAX, tree[Right].MAX) + tree[node].prop;
}
long long query(long long node, long long b, long long e, long long i,
                long long j, long long carry = 0) {
  if (i > e || j < b) return -LLONG_MAX;
  if (b >= i and e <= j) return tree[node].MAX + carry;
  long long Left = node << 1;
  long long Right = (node << 1) + 1;
  long long mid = (b + e) >> 1;
  long long p1 = query(Left, b, mid, i, j, carry + tree[node].prop);
  long long p2 = query(Right, mid + 1, e, i, j, carry + tree[node].prop);
  return max(p1, p2);
}
int main() {
  {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
  };
  cin >> n >> m >> p;
  for (int i = 0; i < n; i++) cin >> a[i].first >> a[i].second;
  for (int i = 0; i < m; i++) cin >> b[i].first >> b[i].second;
  for (int i = 0; i < p; i++) {
    int x, y, z;
    cin >> x >> y >> z;
    mons.push_back(make_tuple(x, y, z));
  }
  sort(a, a + n);
  sort(mons.begin(), mons.end());
  for (int i = 0; i <= 1000003; i++) ara[i] = -LLONG_MAX;
  ;
  for (int i = 0; i < m; i++) {
    ara[b[i].first] = max(ara[b[i].first], -b[i].second);
  }
  init(1, 1, 1000000);
  long long ans = -LLONG_MAX;
  ;
  int l = 0;
  for (int i = 0; i < n; i++) {
    int up = a[i].first;
    long long tmp = -a[i].second;
    while (l < p && get<0>(mons[l]) < up) {
      update(1, 1, 1000000, get<1>(mons[l]) + 1, 1000000, get<2>(mons[l]));
      l++;
    }
    tmp += query(1, 1, 1000000, 1, 1000000);
    ans = max(ans, tmp);
  }
  cout << ans << endl;
}
