#include <bits/stdc++.h>
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:16777216")
using namespace std;
const int INF = 2000000000;
const long long LINF = 2000000000000000000;
template <typename T>
void print(vector<T>& a) {
  for (int i = 0; i < a.size(); i++) cout << a[i] << ' ';
  cout << '\n';
}
template <typename T>
void print(deque<T>& a) {
  for (int i = 0; i < a.size(); i++) cout << a[i] << ' ';
  cout << '\n';
}
template <typename T>
void print(vector<vector<T>>& a) {
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < a[i].size(); j++) cout << a[i][j] << ' ';
    cout << '\n';
  }
}
template <typename T>
void input(vector<T>& a) {
  for (int i = 0; i < a.size(); i++) cin >> a[i];
}
template <typename T>
void input(deque<T>& a) {
  for (int i = 0; i < a.size(); i++) cin >> a[i];
}
template <typename T>
void input(vector<vector<T>>& a) {
  for (int i = 0; i < a.size(); i++)
    for (int j = 0; j < a[i].size(); j++) cin >> a[i][j];
}
const int N = 1000000 + 1010;
long long t[4 * N];
long long tadd[4 * N];
void build(int v, int vl, int vr) {
  if (vl == vr) {
    t[v] = 1e12;
    return;
  }
  int vm = (vl + vr) / 2;
  build(2 * v + 1, vl, vm);
  build(2 * v + 2, vm + 1, vr);
  t[v] = min(t[2 * v + 1], t[2 * v + 2]);
}
void push(int v, int vl, int vr) {
  if (tadd[v] != 0) {
    t[v] += tadd[v];
    if (vl != vr) {
      tadd[2 * v + 1] += tadd[v];
      tadd[2 * v + 2] += tadd[v];
    }
    tadd[v] = 0;
  }
}
const int neutral = 1e15;
long long query(int v, int vl, int vr, int l, int r) {
  push(v, vl, vr);
  if (r < vl || vr < l) return neutral;
  if (vl >= l && vr <= r) return t[v];
  int vm = (vl + vr) / 2;
  long long ql = query(2 * v + 1, vl, vm, l, r);
  long long qr = query(2 * v + 2, vm + 1, vr, l, r);
  return min(ql, qr);
}
void modify(int v, int vl, int vr, int l, int r, long long val) {
  push(v, vl, vr);
  if (r < vl || vr < l) return;
  if (vl >= l && vr <= r) {
    tadd[v] = val;
    push(v, vl, vr);
    return;
  }
  int vm = (vl + vr) / 2;
  modify(2 * v + 1, vl, vm, l, r, val);
  modify(2 * v + 2, vm + 1, vr, l, r, val);
  t[v] = min(t[2 * v + 1], t[2 * v + 2]);
}
struct weapon {
  long long a, ca;
};
struct armor {
  long long b, cb;
};
struct enemy {
  long long x, y, z;
};
bool cmp1(weapon a, weapon b) { return a.a < b.a; }
bool cmp2(armor a, armor b) { return a.b < b.b; }
bool cmp3(enemy a, enemy b) { return a.x < b.x; }
void solve() {
  int n, m, p;
  cin >> n >> m >> p;
  vector<weapon> a(n);
  vector<armor> b(m);
  vector<enemy> c(p);
  for (int i = 0; i < n; i++) cin >> a[i].a >> a[i].ca;
  for (int i = 0; i < m; i++) cin >> b[i].b >> b[i].cb;
  for (int i = 0; i < p; i++) cin >> c[i].x >> c[i].y >> c[i].z;
  sort((a).begin(), (a).end(), cmp1);
  sort((b).begin(), (b).end(), cmp2);
  vector<weapon> new_a;
  vector<armor> new_b;
  for (auto to : a) {
    while (!new_a.empty() && new_a.back().ca >= to.ca) new_a.pop_back();
    if (!new_a.empty() && new_a.back().a == to.a) continue;
    new_a.push_back(to);
  }
  for (auto to : b) {
    while (!new_b.empty() && new_b.back().cb >= to.cb) new_b.pop_back();
    if (!new_b.empty() && new_b.back().b == to.b) continue;
    new_b.push_back(to);
  }
  a = new_a;
  b = new_b;
  build(0, 0, N - 1);
  sort((a).begin(), (a).end(), cmp1);
  sort((c).begin(), (c).end(), cmp3);
  for (auto to : b) {
    modify(0, 0, N - 1, to.b, to.b, -(1e12));
    modify(0, 0, N - 1, to.b, to.b, to.cb);
  }
  int k = 0;
  long long ans = -LINF;
  for (auto to : a) {
    for (; k < p && c[k].x < to.a; k++) {
      modify(0, 0, N - 1, c[k].y + 1, N - 1, -c[k].z);
      ans = max(ans, -(to.ca + query(0, 0, N - 1, 0, N - 1)));
    }
    ans = max(ans, -(to.ca + query(0, 0, N - 1, 0, N - 1)));
  }
  cout << ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int tst = 1;
  while (tst--) solve();
}
