#include <bits/stdc++.h>
using namespace std;
enum STATE { IN, OUT, BOUNDRY };
void fast_in_out() {
  std::ios_base::sync_with_stdio(NULL);
  cin.tie(NULL);
  cout.tie(NULL);
}
int dx[] = {0, 0, -1, 1, -1, 1, -1, 1, 0};
int dy[] = {-1, 1, 0, 0, -1, -1, 1, 1, 0};
int lx[] = {2, 2, -1, 1, -2, -2, -1, 1};
int ly[] = {-1, 1, 2, 2, 1, -1, -2, -2};
const long double eps = 1e-3;
const int N = 1e6 + 10, M = 20 + 10, mod = 1e9 + 7;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) {
  long long t = gcd(a, b);
  return t ? (a / t * b) : 0;
}
int n, m, p;
int a[N], b[N];
int tree[N << 2];
int tmp[N << 2];
struct node {
  int x, y, z;
} qur[N];
bool operator<(node a, node b) {
  if (a.x != b.x) return a.x < b.x;
  if (a.y = b.y) return a.y < b.y;
  return a.z < b.z;
}
void build(int ind, int l, int r) {
  if (l == r) {
    tree[ind] = -b[l];
    return;
  }
  int mid = l + r >> 1;
  build(ind << 1, l, mid);
  build(ind << 1 | 1, mid + 1, r);
  tree[ind] = max(tree[ind << 1], tree[ind << 1 | 1]);
}
void pushdown(int ind) {
  if (tmp[ind]) {
    int l = ind << 1, r = l | 1;
    tmp[l] += tmp[ind];
    tmp[r] += tmp[ind];
    tree[l] += tmp[ind];
    tree[r] += tmp[ind];
  }
  tmp[ind] = 0;
}
void update(int ind, int s, int e, int x, int y, int val) {
  if (x > e || y < s) return;
  if (s >= x && e <= y) {
    tree[ind] += val;
    tmp[ind] += val;
    return;
  }
  pushdown(ind);
  int l = ind << 1, r = l | 1;
  int mid = s + e >> 1;
  update(l, s, mid, x, y, val);
  update(r, mid + 1, e, x, y, val);
  tree[ind] = max(tree[l], tree[r]);
}
int main() {
  fast_in_out();
  cin >> n >> m >> p;
  memset(a, -1, sizeof a);
  memset(b, -1, sizeof b);
  int sz = 0;
  for (int i = 0; i < n; i++) {
    int x, y;
    cin >> x >> y;
    --x;
    sz = max(sz, x);
    if (a[x] != -1)
      a[x] = min(a[x], y);
    else
      a[x] = y;
  }
  int mx = 0;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    --x;
    mx = max(mx, x);
    if (b[x] != -1)
      b[x] = min(b[x], y);
    else
      b[x] = y;
  }
  for (int i = mx - 1; i > -1; --i) {
    if (b[i] != -1)
      b[i] = min(b[i], b[i + 1]);
    else
      b[i] = b[i + 1];
  }
  for (int i = 0; i < p; i++) {
    cin >> qur[i].x >> qur[i].y >> qur[i].z;
    qur[i].x--;
    qur[i].y--;
  }
  sort(qur, qur + p);
  build(1, 0, mx);
  int ans = -2e9, j = 0;
  for (int i = 0; i <= sz; ++i) {
    if (a[i] != -1) {
      while (j < p && qur[j].x < i) {
        if (qur[j].y < mx) update(1, 0, mx, qur[j].y + 1, mx, qur[j].z);
        ++j;
      }
      ans = max(ans, tree[1] - a[i]);
    }
  }
  cout << ans;
  return 0;
}
