#include <bits/stdc++.h>
const int N = 2e5 + 5;
int n, m, p;
std::pair<int, int> a[N], b[N];
int val[N << 2], add[N << 2];
void addNode(int k, int v) {
  add[k] += v;
  val[k] += v;
}
void push(int k) {
  if (!add[k]) return;
  addNode(k << 1, add[k]);
  addNode(k << 1 | 1, add[k]);
  add[k] = 0;
}
void pull(int k) { val[k] = std::max(val[k << 1], val[k << 1 | 1]); }
void build(int k, int l, int r) {
  add[k] = 0;
  if (l == r) {
    val[k] = -b[l].second;
    return;
  }
  int mid = (l + r) >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
  pull(k);
}
void update(int k, int l, int r, int ql, int qr, int v) {
  if (ql <= l && qr >= r) {
    addNode(k, v);
    return;
  }
  int mid = (l + r) >> 1;
  push(k);
  if (ql <= mid) update(k << 1, l, mid, ql, qr, v);
  if (qr > mid) update(k << 1 | 1, mid + 1, r, ql, qr, v);
  pull(k);
}
struct Node {
  int x, y, z;
  bool operator<(const Node &b) const { return x < b.x; }
  void input() { scanf("%d%d%d", &x, &y, &z); }
} c[N];
int main() {
  scanf("%d%d%d", &n, &m, &p);
  for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].first, &a[i].second);
  for (int i = 1; i <= m; i++) scanf("%d%d", &b[i].first, &b[i].second);
  for (int i = 1; i <= p; i++) c[i].input();
  std::sort(a + 1, a + 1 + n);
  std::sort(b + 1, b + 1 + m);
  std::sort(c + 1, c + 1 + p);
  int pos = 1, ans = -2e9;
  build(1, 1, m);
  for (int i = 1; i <= n; i++) {
    while (pos <= p && c[pos].x < a[i].first) {
      int t = std::upper_bound(b + 1, b + 1 + m,
                               std::pair<int, int>(c[pos].y, 1e9 + 1)) -
              b;
      if (t <= m) update(1, 1, m, t, m, c[pos].z);
      ++pos;
    }
    ans = std::max(ans, val[1] - a[i].second);
  }
  printf("%d", ans);
  return 0;
}
