#include <bits/stdc++.h>
using namespace std;
int n, m, p;
pair<int, int> a[200005], b[200005];
pair<pair<int, int>, int> cak[200005];
long long tree[800005];
long long lazy[800005];
void update_tree(int node, int a, int b, int i, int j, int value) {
  if (lazy[node] != 0) {
    tree[node] += lazy[node];
    if (a != b) {
      lazy[node * 2] += lazy[node];
      lazy[node * 2 + 1] += lazy[node];
    }
    lazy[node] = 0;
  }
  if (a > b || a > j || b < i) return;
  if (a >= i && b <= j) {
    tree[node] += value;
    if (a != b) {
      lazy[node * 2] += value;
      lazy[node * 2 + 1] += value;
    }
    return;
  }
  update_tree(node * 2, a, (a + b) / 2, i, j, value);
  update_tree(1 + node * 2, 1 + (a + b) / 2, b, i, j, value);
  tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
long long query_tree(int node, int a, int b, int i, int j) {
  if (a > b || a > j || b < i) return -(1e18);
  if (lazy[node] != 0) {
    tree[node] += lazy[node];
    if (a != b) {
      lazy[node * 2] += lazy[node];
      lazy[node * 2 + 1] += lazy[node];
    }
    lazy[node] = 0;
  }
  if (a >= i && b <= j) return tree[node];
  long long q1 = query_tree(node * 2, a, (a + b) / 2, i, j);
  long long q2 = query_tree(1 + node * 2, 1 + (a + b) / 2, b, i, j);
  long long res = max(q1, q2);
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> p;
  for (int i = 1; i <= n; i++) cin >> a[i].first >> a[i].second;
  for (int i = 1; i <= m; i++) cin >> b[i].first >> b[i].second;
  sort(a + 1, a + 1 + n);
  sort(b + 1, b + 1 + m);
  for (int i = 1; i <= p; i++) {
    cin >> cak[i].first.first >> cak[i].first.second >> cak[i].second;
  }
  sort(cak + 1, cak + 1 + p);
  int cur_cak = 0;
  long long ans = -1e18;
  for (int i = 1; i <= m; i++) update_tree(1, 1, m, i, i, -b[i].second);
  for (int i = 1; i <= n; i++) {
    long long tmp = -a[i].second;
    while (cur_cak + 1 <= p && cak[cur_cak + 1].first.first < a[i].first) {
      cur_cak++;
      int l = 1, r = m;
      while (l < r) {
        int mid = (l + r) / 2;
        if (b[mid].first <= cak[cur_cak].first.second)
          l = mid + 1;
        else
          r = mid;
      }
      if (b[l].first <= cak[cur_cak].first.second) continue;
      update_tree(1, 1, m, l, m, cak[cur_cak].second);
    }
    tmp = tmp + query_tree(1, 1, m, 1, m);
    ans = max(ans, tmp);
  }
  cout << ans << endl;
}
