#include <bits/stdc++.h>
using namespace std;
const int INF = (int)2e9;
struct Equip {
  int m, c;
  bool operator<(const Equip &rhs) const { return m < rhs.m; }
};
struct Monster {
  int x, y, z;
  bool operator<(const Monster &rhs) const { return y < rhs.y; }
};
int n, m, p, addv[800010], maxv[800010];
Equip a[200010], b[200010];
Monster mons[200010];
void maintain(int k, int l, int r) {
  maxv[k] = max(maxv[k * 2], maxv[k * 2 + 1]) + addv[k];
}
void update(int p, int q, int v, int k, int l, int r) {
  if (p <= l && q >= r) {
    addv[k] += v;
    maxv[k] += v;
    return;
  }
  int mid = (l + r) / 2;
  if (p <= mid) update(p, q, v, k * 2, l, mid);
  if (q > mid) update(p, q, v, k * 2 + 1, mid + 1, r);
  maintain(k, l, r);
}
int query(int p, int q, int k, int l, int r, int add) {
  if (p <= l && q >= r) return maxv[k] + add;
  int mid = (l + r) / 2, ans = -INF;
  if (p <= mid) ans = max(ans, query(p, q, k * 2, l, mid, add + addv[k]));
  if (q > mid)
    ans = max(ans, query(p, q, k * 2 + 1, mid + 1, r, add + addv[k]));
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &m, &p);
  for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].m, &a[i].c);
  for (int i = 1; i <= m; i++) scanf("%d%d", &b[i].m, &b[i].c);
  for (int i = 1; i <= p; i++)
    scanf("%d%d%d", &mons[i].x, &mons[i].y, &mons[i].z);
  sort(a + 1, a + n + 1);
  sort(b + 1, b + m + 1);
  sort(mons + 1, mons + p + 1);
  for (int i = 1; i <= n; i++) update(i, i, -a[i].c, 1, 1, n);
  int i = 1, j = 1, l, r, mid, ans = -INF;
  while (i <= m || j <= p) {
    if (i > m || j <= p && b[i].m > mons[j].y) {
      l = 1, r = n + 1;
      while (l < r) {
        mid = (l + r) / 2;
        if (a[mid].m <= mons[j].x)
          l = mid + 1;
        else
          r = mid;
      }
      if (l <= n) update(l, n, mons[j].z, 1, 1, n);
      j++;
    } else {
      ans = max(ans, query(1, n, 1, 1, n, 0) - b[i].c);
      i++;
    }
  }
  printf("%d\n", ans);
  return 0;
}
