#include <bits/stdc++.h>
using namespace std;
template <typename _T>
inline void _DBG(const char *s, _T x) {
  cerr << s << " = " << x << "\n";
}
template <typename _T, typename... args>
void _DBG(const char *s, _T x, args... a) {
  while (*s != ',') cerr << *s++;
  cerr << " = " << x << ',';
  _DBG(s + 1, a...);
}
struct SegmentTree {
  const static int MAX = 1 << 20;
  long long INF = (long long)1e18 + 7;
  vector<pair<long long, long long> > tree;
  vector<long long> lazy;
  SegmentTree() {
    tree.resize(2 * MAX, {0, 0}), lazy.resize(2 * MAX, 0);
    for (int i = 0; i <= MAX - 1; i++) tree[i + MAX].second = i;
    for (int i = MAX - 1; i; i--) tree[i] = max(tree[2 * i], tree[2 * i + 1]);
  }
  inline void propagate(int node, int l, int r) {
    if (!lazy[node]) return;
    tree[node].first += lazy[node];
    if (l != r) {
      lazy[2 * node] += lazy[node];
      lazy[2 * node + 1] += lazy[node];
    }
    lazy[node] = 0;
  }
  void update(int a, int b, long long val, int node = 1, int l = 0,
              int r = MAX - 1) {
    propagate(node, l, r);
    if (b < l || r < a) return;
    if (a <= l && r <= b)
      lazy[node] += val, propagate(node, l, r);
    else {
      update(a, b, val, 2 * node, l, (l + r) / 2);
      update(a, b, val, 2 * node + 1, (l + r) / 2 + 1, r);
      tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
  }
  pair<long long, long long> query(int a, int b, int node = 1, int l = 0,
                                   int r = MAX - 1) {
    propagate(node, l, r);
    if (b < l || r < a) return {-INF, 0};
    if (a <= l && r <= b) return tree[node];
    return max(query(a, b, 2 * node, l, (l + r) / 2),
               query(a, b, 2 * node + 1, (l + r) / 2 + 1, r));
  }
};
const int N = 1e6 + 7;
const long long INF = (long long)1e18 + 7;
int n, m, p;
pair<long long, long long> A[N], B[N];
pair<pair<long long, long long>, long long> Q[N];
long long init[N];
map<long long, int> MP;
SegmentTree tree;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> p;
  for (int i = 1; i <= n; i++) cin >> A[i].first >> A[i].second;
  for (int i = 1; i <= m; i++) {
    cin >> B[i].first >> B[i].second;
    MP[B[i].first] = 1;
  }
  for (int i = 1; i <= p; i++) {
    cin >> Q[i].first.first >> Q[i].first.second >> Q[i].second;
    MP[Q[i].first.second + 1] = 1;
  }
  sort(A + 1, A + n + 1);
  sort(B + 1, B + m + 1);
  sort(Q + 1, Q + p + 1);
  int cnt = 0;
  for (auto &pp : MP) pp.second = ++cnt;
  for (int i = 1; i <= cnt; i++) init[i] = -INF;
  for (int i = 1; i <= m; i++) {
    int pp = MP[B[i].first];
    init[pp] = max(init[pp], -B[i].second);
  }
  for (int i = 1; i <= cnt; i++) tree.update(i, i, init[i]);
  int id = 1;
  long long best = -INF;
  for (int i = 1; i <= n; i++) {
    while (id <= p && Q[id].first.first < A[i].first) {
      tree.update(MP[Q[id].first.second + 1], cnt, Q[id].second);
      id++;
    }
    best = max(best, tree.query(1, cnt).first - A[i].second);
  }
  cout << best << "\n";
  return 0;
}
