#include <bits/stdc++.h>
using namespace std;
struct Weapon {
  int attack, price;
};
struct Armor {
  int defence, price;
};
struct Monster {
  int defence, attack, reward;
};
int n, m, p;
vector<Weapon> a;
vector<Armor> b;
vector<Monster> c;
bool weapons_by_attack(const Weapon& t, const Weapon& k) {
  return t.attack < k.attack;
}
bool armors_by_defence(const Armor& t, const Armor& k) {
  return t.defence < k.defence;
}
bool monsters_by_defence(const Monster& t, const Monster& k) {
  return t.defence < k.defence;
}
struct Node {
  int l, r;
  int mx, upd;
};
Node tree[(1 << 20) - 1];
void calc(int v) {
  tree[v].mx = max(tree[2 * v].mx + tree[2 * v].upd,
                   tree[2 * v + 1].mx + tree[2 * v + 1].upd);
}
void build(int v, int l, int r) {
  tree[v].l = l;
  tree[v].r = r;
  tree[v].upd = 0;
  if (r - l > 1) {
    int mid = (l + r) / 2;
    build(2 * v, l, mid);
    build(2 * v + 1, mid, r);
    calc(v);
  } else {
    tree[v].mx = -b[l].price;
  }
}
void push(int v) {
  tree[2 * v].upd += tree[v].upd;
  tree[2 * v + 1].upd += tree[v].upd;
  tree[v].upd = 0;
}
void add(int v, int l, int r, int val) {
  if (tree[v].r <= l || tree[v].l >= r) {
    return;
  }
  if (l <= tree[v].l && tree[v].r <= r) {
    tree[v].upd += val;
    return;
  }
  push(v);
  add(2 * v, l, r, val);
  add(2 * v + 1, l, r, val);
  calc(v);
}
int get_max(int v, int l, int r) {
  if (tree[v].r <= l || tree[v].l >= r) {
    return INT_MIN;
  }
  if (l <= tree[v].l && tree[v].r <= r) {
    return tree[v].mx + tree[v].upd;
  }
  push(v);
  int ret_val = max(get_max(2 * v, l, r), get_max(2 * v + 1, l, r));
  calc(v);
  return ret_val;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n >> m >> p;
  a.resize(n + 1);
  b.resize(m + 1);
  c.resize(p + 1);
  for (int i = 1; i <= n; ++i) {
    cin >> a[i].attack >> a[i].price;
  }
  for (int i = 1; i <= m; ++i) {
    cin >> b[i].defence >> b[i].price;
  }
  for (int i = 1; i <= p; ++i) {
    cin >> c[i].defence >> c[i].attack >> c[i].reward;
  }
  sort(a.begin() + 1, a.end(), weapons_by_attack);
  sort(b.begin() + 1, b.end(), armors_by_defence);
  sort(c.begin() + 1, c.end(), monsters_by_defence);
  build(1, 1, m + 1);
  int ans = INT_MIN;
  int monsters_ptr = 1;
  for (int i = 1; i <= n; ++i) {
    while (monsters_ptr <= p && a[i].attack > c[monsters_ptr].defence) {
      int start_suff_indx =
          lower_bound(b.begin() + 1, b.end(),
                      Armor{c[monsters_ptr].attack + 1, 0}, armors_by_defence) -
          b.begin();
      if (start_suff_indx < m + 1) {
        add(1, start_suff_indx, m + 1, c[monsters_ptr].reward);
      }
      ++monsters_ptr;
    }
    ans = max(ans, -a[i].price + get_max(1, 1, m + 1));
  }
  cout << ans;
  return 0;
}
