#include <bits/stdc++.h>
using std::sort;
using std::upper_bound;
const long long maxn = 2e5 + 5;
const long long inf = 1e18;
long long mx[maxn << 2], add[maxn << 2], x[maxn];
long long n, m, p, ans = -inf;
struct attack {
  long long a, ca;
} b[maxn], at[maxn];
struct dfense {
  long long b, cb;
} d[maxn], df[maxn];
struct monster {
  long long a, d, c;
} c[maxn];
long long max(long long x, long long y) { return x > y ? x : y; }
bool cmp1(attack x, attack y) {
  return x.a < y.a || (x.a == y.a && x.ca < y.ca);
}
bool cmp2(dfense x, dfense y) {
  return x.b < y.b || (x.b == y.b && x.cb < y.cb);
}
bool cmp3(monster x, monster y) { return x.d < y.d; }
void read(long long& x) {
  x = 0;
  bool f = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = 1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch & 15);
    ch = getchar();
  }
  if (f) x = -x;
  return;
}
void Spread(long long p) {
  if (!add[p]) return;
  add[p << 1] += add[p];
  add[p << 1 | 1] += add[p];
  mx[p << 1] += add[p];
  mx[p << 1 | 1] += add[p];
  add[p] = 0;
  return;
}
void build(long long p, long long l, long long r) {
  if (l == r) {
    mx[p] = -at[l].ca;
    return;
  }
  long long mid = l + r >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
  mx[p] = max(mx[p << 1], mx[p << 1 | 1]);
  return;
}
void Update(long long p, long long L, long long R, long long x, long long y,
            long long v) {
  if (x <= L && R <= y) {
    add[p] += v;
    mx[p] += v;
    return;
  }
  Spread(p);
  long long mid = L + R >> 1;
  if (x <= mid) Update(p << 1, L, mid, x, y, v);
  if (y > mid) Update(p << 1 | 1, mid + 1, R, x, y, v);
  mx[p] = max(mx[p << 1], mx[p << 1 | 1]);
  return;
}
signed main() {
  read(n);
  read(m);
  read(p);
  for (long long i = 1; i <= n; ++i) {
    read(b[i].a);
    read(b[i].ca);
  }
  for (long long i = 1; i <= m; ++i) {
    read(d[i].b);
    read(d[i].cb);
  }
  sort(b + 1, b + n + 1, cmp1);
  sort(d + 1, d + m + 1, cmp2);
  long long cnt = 0;
  for (long long i = 1; i <= n; ++i) {
    if (b[i].a != at[cnt].a) at[++cnt] = b[i];
  }
  n = cnt;
  cnt = 0;
  for (long long i = 1; i <= m; ++i) {
    if (d[i].b != df[cnt].b) df[++cnt] = d[i];
  }
  m = cnt;
  for (long long i = 1; i <= p; ++i)
    scanf("%lld%lld%lld", &c[i].a, &c[i].d, &c[i].c);
  sort(c + 1, c + p + 1, cmp3);
  memset(mx, -0x3f, sizeof(mx));
  build(1, 1, n);
  long long j = 1;
  for (long long i = 1; i <= n; ++i) x[i] = at[i].a;
  for (long long i = 1; i <= m; ++i) {
    for (; j <= p && c[j].d < df[i].b; ++j) {
      long long p = upper_bound(x + 1, x + n + 1, c[j].a) - x;
      if (x[p] > c[j].a) Update(1, 1, n, p, n, c[j].c);
    }
    ans = max(ans, mx[1] - df[i].cb);
  }
  printf("%lld", ans);
  return 0;
}
