#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
const long long modu = 1000000007;
class SegmentTree {
 public:
  long long n;
  vector<long long> tree;
  vector<long long> lazy;
  SegmentTree(long long N) : tree(4 * N, 0), lazy(4 * N, 0) { n = N; }
  void build(vector<pair<long long, long long>> &arr) {
    build(arr, 0, n - 1, 0);
  }
  void build(vector<pair<long long, long long>> &arr, long long l, long long r,
             long long pos) {
    if (l > r) {
      return;
    }
    if (l == r) {
      tree[pos] = -arr[l].second;
    } else {
      long long mid = l + (r - l) / 2;
      build(arr, l, mid, 2 * pos + 1);
      build(arr, mid + 1, r, 2 * pos + 2);
      tree[pos] = max(tree[2 * pos + 1], tree[2 * pos + 2]);
    }
  }
  void update(long long L, long long R, long long newVal) {
    update(L, R, newVal, 0, n - 1, 0);
  }
  void update(long long L, long long R, long long newVal, long long l,
              long long r, long long pos) {
    if (lazy[pos] != 0) {
      if (l != r) {
        lazy[2 * pos + 1] += lazy[pos];
        lazy[2 * pos + 2] += lazy[pos];
      }
      tree[pos] += lazy[pos];
      lazy[pos] = 0;
    }
    if (R < l || r < L) {
      return;
    }
    if (L <= l && r <= R) {
      tree[pos] += newVal;
      if (l != r) {
        lazy[2 * pos + 1] += newVal;
        lazy[2 * pos + 2] += newVal;
      }
      return;
    }
    long long mid = l + (r - l) / 2;
    update(L, R, newVal, l, mid, 2 * pos + 1);
    update(L, R, newVal, mid + 1, r, 2 * pos + 2);
    tree[pos] = max(tree[2 * pos + 1], tree[2 * pos + 2]);
  }
  long long query(long long L, long long R) { return query(L, R, 0, n - 1, 0); }
  long long query(long long L, long long R, long long l, long long r,
                  long long pos) {
    if (R < l || r < L) {
      return INT_MIN;
    }
    if (lazy[pos] != 0) {
      if (l != r) {
        lazy[2 * pos + 1] += lazy[pos];
        lazy[2 * pos + 2] += lazy[pos];
      }
      tree[pos] += lazy[pos];
      lazy[pos] = 0;
    }
    if (L <= l && r <= R) {
      return tree[pos];
    } else {
      long long mid = l + (r - l) / 2;
      long long leftAns = query(L, R, l, mid, 2 * pos + 1);
      long long rightAns = query(L, R, mid + 1, r, 2 * pos + 2);
      long long ans = max(leftAns, rightAns);
      return ans;
    }
  }
};
bool cmp(const long long &a, const pair<long long, long long> &b) {
  return (a < b.first);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ;
  long long n, m, p;
  cin >> n >> m >> p;
  vector<pair<long long, long long>> a(n), b(m);
  vector<tuple<long long, long long, long long>> k(p);
  for (long long i = 0; i < n; i++) {
    cin >> a[i].first;
    cin >> a[i].second;
  }
  for (long long i = 0; i < m; i++) {
    cin >> b[i].first;
    cin >> b[i].second;
  }
  for (long long i = 0; i < p; i++) {
    cin >> get<0>(k[i]);
    cin >> get<1>(k[i]);
    cin >> get<2>(k[i]);
  }
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  sort(k.begin(), k.end());
  SegmentTree tree(m);
  tree.build(b);
  long long _max = -1e18;
  long long ind = 0;
  for (long long i = 0; i < n; i++) {
    while (ind < p && get<0>(k[ind]) < a[i].first) {
      long long up =
          upper_bound(b.begin(), b.end(), get<1>(k[ind]), cmp) - b.begin();
      tree.update(up, m - 1, get<2>(k[ind]));
      ind++;
    }
    _max = max(_max, tree.query(0, m - 1) - a[i].second);
  }
  cout << _max << '\n';
  return 0;
}
