#include <bits/stdc++.h>
using namespace std;
int n, m, p;
struct weapon {
  long long x, cost;
  weapon() {}
  weapon(long long x, long long cost) : x(x), cost(cost) {}
  bool operator<(const weapon &r) const {
    return x == r.x ? cost < r.cost : x < r.x;
  }
  bool operator==(const weapon &r) const { return x == r.x && cost == r.cost; }
} a[200002];
struct armor {
  long long x, cost;
  armor() {}
  armor(long long x, long long cost) : x(x), cost(cost) {}
  bool operator<(const armor &r) const {
    return x == r.x ? cost < r.cost : x < r.x;
  }
  bool operator==(const armor &r) const { return x == r.x && cost == r.cost; }
} b[200002];
struct monster {
  long long x, y, z;
  bool operator<(const monster &r) const { return y < r.y; }
} c[200002];
long long tree[800002];
long long lazy[800002];
void initialize(int i, int l, int r) {
  if (l == r) {
    tree[i] = -a[l].cost;
    return;
  }
  int m = (l + r) >> 1;
  initialize(i * 2, l, m);
  initialize(i * 2 + 1, m + 1, r);
  tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}
void propagate(int i, int l, int r) {
  if (!lazy[i]) return;
  tree[i] += lazy[i];
  if (l != r) lazy[i * 2] += lazy[i], lazy[i * 2 + 1] += lazy[i];
  lazy[i] = 0;
}
long long getTree(int i, int l, int r, int s, int e) {
  if (e < s) return -1000000000000000000LL;
  propagate(i, l, r);
  if (l == s && r == e) return tree[i];
  int m = (l + r) >> 1;
  long long ret = LLONG_MIN;
  if (s <= m) ret = max(ret, getTree(i * 2, l, m, s, min(m, e)));
  if (m < e) ret = max(ret, getTree(i * 2 + 1, m + 1, r, max(s, m + 1), e));
  return ret;
}
void updateTree(int i, int l, int r, int s, int e, long long val) {
  if (e < s) return;
  propagate(i, l, r);
  if (l == s && r == e) {
    lazy[i] += val;
    propagate(i, l, r);
    return;
  }
  int m = (l + r) >> 1;
  if (s <= m)
    updateTree(i * 2, l, m, s, min(m, e), val);
  else
    propagate(i * 2, l, m);
  if (m < e)
    updateTree(i * 2 + 1, m + 1, r, max(s, m + 1), e, val);
  else
    propagate(i * 2 + 1, m + 1, r);
  tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}
long long ans = LLONG_MIN;
int main() {
  scanf("%d %d %d", &n, &m, &p);
  for (int i = 1; i <= n; i++) scanf("%lld %lld", &a[i].x, &a[i].cost);
  for (int i = 1; i <= m; i++) scanf("%lld %lld", &b[i].x, &b[i].cost);
  sort(a + 1, a + n + 1), sort(b + 1, b + m + 1);
  for (int i = 1; i < n; i++) {
    if (a[i].x == a[i + 1].x)
      a[i].cost = a[i + 1].cost = min(a[i].cost, a[i + 1].cost);
  }
  n = unique(a + 1, a + n + 1) - a - 1;
  for (int i = 1; i < m; i++) {
    if (b[i].x == b[i + 1].x)
      b[i].cost = b[i + 1].cost = min(b[i].cost, b[i + 1].cost);
  }
  m = unique(b + 1, b + m + 1) - b - 1;
  for (int i = 1; i <= p; i++) {
    scanf("%lld %lld %lld", &c[i].x, &c[i].y, &c[i].z);
    c[i].x = upper_bound(a + 1, a + n + 1, weapon(c[i].x, INT_MAX)) - a;
    c[i].y = upper_bound(b + 1, b + m + 1, armor(c[i].y, INT_MAX)) - b;
  }
  sort(c + 1, c + p + 1);
  initialize(1, 1, n);
  int pnt = 1;
  for (int i = 1; i <= m; i++) {
    while (pnt <= p && c[pnt].y <= i) {
      updateTree(1, 1, n, c[pnt].x, n, c[pnt].z);
      pnt++;
    }
    ans = max(ans, getTree(1, 1, n, 1, n) - b[i].cost);
  }
  printf("%lld", ans);
}
