#include <bits/stdc++.h>
using namespace std;
const long long MAXN = (1 << 18), inf = 1e18 + 1;
struct monster {
  long long x = 0, y = 0, z = 0;
  bool operator<(const monster &a) const { return x < a.x; }
};
vector<long long> t(5 * MAXN, -2 * inf), push(5 * MAXN);
vector<pair<pair<long long, long long>, long long>> b(MAXN + 1);
vector<pair<long long, long long>> a;
vector<monster> monsters;
void doPush(long long v) {
  if (!push[v]) return;
  t[v] += push[v];
  push[2 * v] += push[v];
  push[2 * v + 1] += push[v];
  push[v] = 0;
  return;
}
void build(long long v, long long tl, long long tr) {
  if (tl == tr) {
    t[v] = (-1) * b[tl].first.second;
    return;
  }
  long long tm = (tl + tr) / 2;
  build(2 * v, tl, tm);
  build(2 * v + 1, tm + 1, tr);
  t[v] = max(t[2 * v], t[2 * v + 1]);
}
void update(long long v, long long tl, long long tr, long long l, long long r,
            long long val) {
  doPush(v);
  if (l > r) return;
  if (tl == l && tr == r) {
    push[v] = val;
    doPush(v);
    return;
  }
  long long tm = (tr + tl) / 2;
  update(2 * v, tl, tm, l, min(r, tm), val);
  update(2 * v + 1, tm + 1, tr, max(l, tm + 1), r, val);
  t[v] = max(t[2 * v], t[2 * v + 1]);
}
long long get(long long v, long long tl, long long tr, long long l,
              long long r) {
  doPush(v);
  if (l > r) return -2 * inf;
  if (tl == l && tr == r) return t[v];
  long long tm = (tr + tl) / 2;
  return max(get(2 * v, tl, tm, l, min(r, tm)),
             get(2 * v + 1, tm + 1, tr, max(l, tm + 1), r));
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m, p;
  cin >> n >> m >> p;
  a = vector<pair<long long, long long>>(n + 1);
  monsters = vector<monster>(p + 1);
  for (long long i = 1; i <= n; i++) {
    cin >> a[i].first >> a[i].second;
  }
  for (long long i = 1; i <= m; i++) {
    cin >> b[i].first.first >> b[i].first.second;
  }
  for (long long i = 1; i <= p; i++) {
    cin >> monsters[i].x >> monsters[i].y >> monsters[i].z;
  }
  sort(a.begin() + 1, a.end());
  sort(b.begin() + 1, b.begin() + 1 + m);
  sort(monsters.begin() + 1, monsters.end());
  set<pair<pair<long long, long long>, long long>> b_;
  for (long long i = 1; i <= m; i++) {
    b[i].second = i;
    b_.insert(b[i]);
  }
  build(1, 1, MAXN);
  long long j = 1, ans = -inf;
  for (long long i = 1; i <= n; i++) {
    while (j <= p && monsters[j].x < a[i].first) {
      long long ind = m + 1;
      auto ub = b_.upper_bound({{monsters[j].y, inf}, 0});
      if (ub != b_.end()) ind = ub->second;
      update(1, 1, MAXN, ind, m, monsters[j].z);
      j++;
    }
    ans = max(ans, get(1, 1, MAXN, 1, m) - a[i].second);
  }
  cout << ans << "\n";
  return 0;
}
