#include <bits/stdc++.h>
using namespace std;
const long long INF = 9223372036854775807;
const long long N = 200010;
long long n, m, p;
struct Person {
  long long x, y, val;
} a[N], b[N], mo[N];
long long w[N];
bool cmp(Person a, Person b) { return a.x < b.x; }
struct Node {
  long long l, r;
  long long Max, lazy;
} tree[N << 2];
void push_up(long long i) {
  tree[i].Max = max(tree[i * 2].Max, tree[i * 2 + 1].Max);
  return;
}
void push_down(long long i) {
  if (!tree[i].lazy) return;
  tree[i * 2].Max += tree[i].lazy;
  tree[i * 2 + 1].Max += tree[i].lazy;
  tree[i * 2].lazy += tree[i].lazy;
  tree[i * 2 + 1].lazy += tree[i].lazy;
  tree[i].lazy = 0;
  return;
}
void build(long long i, long long l, long long r) {
  tree[i].l = l, tree[i].r = r;
  if (l == r) {
    tree[i].Max = -b[l].val;
    return;
  }
  long long mid = (l + r) / 2;
  build(i * 2, l, mid);
  build(i * 2 + 1, mid + 1, r);
  push_up(i);
  return;
}
void update(long long i, long long l, long long r, long long k) {
  if (l > r) return;
  if (l <= tree[i].l && tree[i].r <= r) {
    tree[i].Max += k;
    tree[i].lazy += k;
    return;
  }
  push_down(i);
  long long mid = (l + r) / 2;
  if (l <= tree[i * 2].r) update(i * 2, l, r, k);
  if (r >= tree[i * 2 + 1].l) update(i * 2 + 1, l, r, k);
  push_up(i);
  return;
}
long long query(long long i, long long l, long long r) {
  if (l <= tree[i].l && tree[i].r <= r) return tree[i].Max;
  push_down(i);
  long long mid = (l + r) / 2;
  long long ans = -INF;
  if (l <= tree[i * 2].r) ans = max(ans, query(i * 2, l, r));
  if (r >= tree[i * 2 + 1].l) ans = max(ans, query(i * 2 + 1, l, r));
  return ans;
}
signed main() {
  scanf("%d%d%d", &n, &m, &p);
  for (long long i = 1; i <= n; i++) scanf("%d%d", &a[i].x, &a[i].val);
  for (long long i = 1; i <= m; i++) scanf("%d%d", &b[i].x, &b[i].val);
  for (long long i = 1; i <= p; i++)
    scanf("%d%d%d", &mo[i].x, &mo[i].y, &mo[i].val);
  sort(a + 1, a + n + 1, cmp);
  sort(b + 1, b + m + 1, cmp);
  sort(mo + 1, mo + p + 1, cmp);
  for (long long i = 1; i <= m; i++) w[i] = b[i].x;
  build(1, 1, m);
  long long j = 1, ans = -INF;
  for (long long i = 1; i <= n; i++) {
    while (j <= p && a[i].x > mo[j].x) {
      long long pos = upper_bound(w + 1, w + m + 1, mo[j].y) - w;
      if (pos <= m) update(1, pos, m, mo[j].val);
      j++;
    }
    ans = max(ans, tree[1].Max - a[i].val);
  }
  printf("%lld", ans);
  return 0;
}
