#include <bits/stdc++.h>
#pragma GCC optimize("03")
using namespace std;
struct monst {
  long long x, y, c;
};
int n, m, p, vf;
long long h[1600100], lazy[1600100];
pair<long long, long long> a[200100], b[200100], st[200100];
monst v[200100];
map<long long, long long> mp, idx;
void update(int st, int dr, int pos, int l, int r, long long val) {
  if (lazy[pos] != 0) {
    h[pos] += lazy[pos];
    if (st != dr) {
      lazy[(pos << 1)] += lazy[pos];
      lazy[((pos << 1) | 1)] += lazy[pos];
    }
    lazy[pos] = 0;
  }
  if (st > dr || dr < l || st > r) return;
  if (l <= st && dr <= r) {
    h[pos] += val;
    if (st != dr) {
      lazy[(pos << 1)] += val;
      lazy[((pos << 1) | 1)] += val;
    }
    return;
  }
  int mid = st + dr >> 1;
  update(st, mid, (pos << 1), l, r, val);
  update(mid + 1, dr, ((pos << 1) | 1), l, r, val);
  h[pos] = max(h[(pos << 1)], h[((pos << 1) | 1)]);
}
long long query(int st, int dr, int pos, int l, int r) {
  if (lazy[pos] != 0) {
    h[pos] += lazy[pos];
    if (st != dr) {
      lazy[(pos << 1)] += lazy[pos];
      lazy[((pos << 1) | 1)] += lazy[pos];
    }
    lazy[pos] = 0;
  }
  if (st > dr || dr < l || st > r) return INT_MIN;
  if (l <= st && r >= dr) return h[pos];
  int mid = (st + dr) / 2;
  long long left = INT_MIN, right = INT_MIN;
  if (l <= mid) left = query(st, mid, (pos << 1), l, r);
  if (r > mid) right = query(mid + 1, dr, ((pos << 1) | 1), l, r);
  return max(left, right);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  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;
    if (mp.count(b[i].first) == 0) {
      mp[b[i].first] = b[i].second;
    } else {
      mp[b[i].first] = min(mp[b[i].first], b[i].second);
    }
  }
  sort(a + 1, a + n + 1);
  for (auto it : mp) {
    st[++vf] = it;
    idx[it.first] = vf;
  }
  for (int i = 1; i <= p; i++) cin >> v[i].x >> v[i].y >> v[i].c;
  sort(v + 1, v + p + 1,
       [&](const monst& a, const monst& b) { return a.x < b.x; });
  for (int i = 1; i <= vf; i++) {
    update(1, vf, 1, i, i, -st[i].second);
  }
  long long mx = INT_MIN;
  int u = 1;
  for (int i = 1; i <= n; i++) {
    long long cur = -a[i].second;
    while (u <= p && v[u].x < a[i].first) {
      if (v[u].y >= st[vf].first) {
        u++;
        continue;
      }
      int left = 1, right = vf;
      while (left <= right) {
        int mid = (left + right) / 2;
        if (st[mid].first > v[u].y)
          right = mid - 1;
        else
          left = mid + 1;
      }
      update(1, vf, 1, left, vf, v[u].c);
      u++;
    }
    cur += query(1, vf, 1, 1, vf);
    mx = max(cur, mx);
  }
  cout << mx;
  return 0;
}
