#include <bits/stdc++.h>
const long long int MOD = 1e9 + 7;
const long long int INF = 1011111111;
const long long int LLINF = 1000111000111000111LL;
const long double EPS = 1e-10;
const long double PI = 3.14159265358979323;
using namespace std;
inline long long int add(long long int a, long long int b) {
  a += b;
  if (a >= MOD) a -= MOD;
  return a;
}
inline long long int sub(long long int a, long long int b) {
  a -= b;
  if (a < 0) a += MOD;
  return a;
}
inline long long int mul(long long int a, long long int b) {
  return (a * 1ll * b) % MOD;
}
long long int power(long long int base, long long int exponent) {
  long long int ans = 1;
  while (exponent != 0) {
    if (exponent & 1) ans = (1LL * ans * base);
    base = (1LL * base * base);
    exponent >>= 1;
  }
  return ans;
}
const long long int N = 1e6 + 5;
bool comp(pair<pair<long long int, long long int>, long long int> a,
          pair<pair<long long int, long long int>, long long int> b) {
  if (a.first.first != b.first.first) return a.first.first < b.first.first;
  return a.first.second < b.first.second;
}
long long int minb[N + 5];
long long int tree[4 * N];
long long int lazy[4 * N];
void build(long long int node, long long int start, long long int end) {
  if (start == end) {
    tree[node] = minb[start];
    return;
  }
  long long int mid = (start + end) / 2;
  build(2 * node, start, mid);
  build(2 * node + 1, mid + 1, end);
  tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void propogate(long long int node, long long int start, long long int end) {
  if (lazy[node] == 0) return;
  long long int mid = start + (end - start) / 2;
  tree[2 * node] += lazy[node];
  tree[2 * node + 1] += lazy[node];
  lazy[2 * node] += lazy[node];
  lazy[2 * node + 1] += lazy[node];
  lazy[node] = 0;
  return;
}
void update(long long int node, long long int start, long long int end,
            long long int l, long long int r, long long int val) {
  if (end < l || start > r) return;
  if (l <= start && end <= r) {
    tree[node] += val;
    lazy[node] += val;
    return;
  }
  propogate(node, start, end);
  long long int mid = (start + end) / 2;
  update(2 * node, start, mid, l, r, val);
  update(2 * node + 1, mid + 1, end, l, r, val);
  tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
long long int query(long long int node, long long int start, long long int end,
                    long long int l, long long int r) {
  if (start > r || end < l) return -LLINF;
  if (l <= start && end <= r) return tree[node];
  propogate(node, start, end);
  long long int mid = start + (end - start) / 2;
  return max(query(2 * node, start, mid, l, r),
             query(2 * node + 1, mid + 1, end, l, r));
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long int n, m, i, j, k, p;
  cin >> n >> m >> p;
  long long int ma = LLINF, mb = LLINF;
  vector<pair<long long int, long long int> > a(n);
  vector<pair<long long int, long long int> > b(m);
  vector<pair<pair<long long int, long long int>, long long int> > c(p);
  for (i = 0; i < n; i++) {
    cin >> a[i].first >> a[i].second;
    ma = min(ma, a[i].second);
  }
  for (i = 0; i < m; i++) {
    cin >> b[i].first >> b[i].second;
    mb = min(mb, b[i].second);
  }
  for (i = 0; i < p; i++)
    cin >> c[i].first.first >> c[i].first.second >> c[i].second;
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  sort(c.begin(), c.end(), comp);
  for (i = 0; i < N; i++) minb[i] = -LLINF;
  for (i = 0; i < m; i++) {
    minb[b[i].first] = max(minb[b[i].first], -b[i].second);
  }
  for (i = N - 2; i > 0; i--) {
    minb[i] = max(minb[i], minb[i + 1]);
  }
  build(1, 0, N - 1);
  long long int ans = -LLINF;
  long long int pointer = 0;
  for (i = 0; i < n; i++) {
    long long int x = a[i].first;
    while (pointer < p && c[pointer].first.first < x) {
      long long int y = c[pointer].first.second;
      long long int val = c[pointer].second;
      update(1, 0, N - 1, y + 1ll, N - 1, val);
      pointer++;
    }
    long long int maxm = query(1, 0, N - 1, 1, N - 1);
    long long int cos = maxm - a[i].second;
    ans = max(ans, cos);
  }
  if (ans == -LLINF)
    cout << (-(ma + mb));
  else
    cout << ans;
  cerr << '\n'
       << "Time elapsed : " << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
}
