#include <bits/stdc++.h>
using namespace std;
static int io_sync_off = []() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  return 0;
}();
long long Pow(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  while (b) {
    if (b & 1) (res *= a) %= mod;
    (a *= a) %= mod;
    b >>= 1;
  }
  return res % mod;
}
long long inv(long long a, long long p) {
  if (a == 1) return 1;
  return (p - p / a) * inv(p % a, p) % p;
}
long long C(long long n, long long m, long long p) {
  long long res = 1;
  for (long long i = 1, j = n - m + 1; i <= m; ++i, ++j) {
    res = res * inv(i, p) % p * j % p;
  }
  return res;
}
const int N = 2e5 + 10;
struct M {
  bool operator<(const M &t) const { return x < t.x; }
  int x, y, z;
};
long long Max[N * 4], tag[N * 4];
void push_down(int o) {
  int lc = 2 * o, rc = 2 * o + 1;
  tag[lc] += tag[o];
  tag[rc] += tag[o];
  Max[lc] += tag[o];
  Max[rc] += tag[o];
  tag[o] = 0;
}
void update(int a, int b, int v, int o, int l, int r) {
  if (a == b) return;
  if (a <= l && b >= r) {
    tag[o] += v;
    Max[o] += v;
    return;
  }
  push_down(o);
  int mid = (l + r) >> 1, lc = 2 * o, rc = 2 * o + 1;
  if (a < mid) update(a, b, v, lc, l, mid);
  if (b > mid) update(a, b, v, rc, mid, r);
  Max[o] = max(Max[lc], Max[rc]);
}
M Mon[N];
pair<long long, long long> a[N], b[N];
int d[N];
void build(int o, int l, int r) {
  if (r - l == 1) {
    Max[o] = -b[l].second;
    return;
  }
  int mid = (l + r) >> 1, lc = 2 * o, rc = 2 * o + 1;
  build(lc, l, mid);
  build(rc, mid, r);
  Max[o] = max(Max[lc], Max[rc]);
}
int main() {
  int n, m, p;
  scanf("%d%d", &n, &m);
  scanf("%d", &p);
  for (int i = 0; i < n; ++i) scanf("%d%d", &a[i].first, &a[i].second);
  for (int i = 0; i < m; ++i) scanf("%d%d", &b[i].first, &b[i].second);
  for (int i = 0; i < p; ++i) scanf("%d%d%d", &Mon[i].x, &Mon[i].y, &Mon[i].z);
  sort(a, a + n);
  sort(b, b + m);
  sort(Mon, Mon + p);
  for (int i = 0; i < m; ++i) d[i] = b[i].first;
  build(1, 0, m);
  long long ans = -1e18;
  int j = 0;
  for (int i = 0; i < n; ++i) {
    while (j < p && Mon[j].x < a[i].first) {
      int l = upper_bound(d, d + m, Mon[j].y) - d;
      update(l, m, Mon[j++].z, 1, 0, m);
    }
    ans = max(ans, Max[1] - a[i].second);
  }
  printf("%lld", ans);
  return 0;
}
