#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int mod = 1e9 + 7;
long long int powmod(long long int a, long long int b) {
  long long int res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
int nxt() {
  int x;
  scanf("%d", &x);
  return x;
}
const int nax = 2e5 + 5;
vector<pair<int, int>> a, b;
int n, m, p;
vector<pair<int, pair<int, int>>> mon;
struct SegTree {
  struct Node {
    int val, delay;
    Node(int val_ = 0) {
      val = val_;
      delay = 0;
    }
    void add(int sum) {
      val += sum;
      delay += sum;
    }
  };
  Node nodes[nax << 2];
  int left(int c) { return c * 2 + 1; }
  int right(int c) { return c * 2 + 2; }
  void build(int node, int l, int r) {
    if (l == r) {
      nodes[node] = Node(-b[l].second);
      return;
    }
    int mid = (l + r) / 2;
    build(left(node), l, mid);
    build(right(node), mid + 1, r);
    nodes[node] = Node(max(nodes[left(node)].val, nodes[right(node)].val));
  }
  void propagate(int node) {
    if (nodes[node].delay) {
      nodes[left(node)].add(nodes[node].delay);
      nodes[right(node)].add(nodes[node].delay);
      nodes[node].delay = 0;
    }
  }
  void update(int node, int l, int r, int c, int sum) {
    if (r < c) return;
    if (l >= c) return nodes[node].add(sum);
    propagate(node);
    int mid = (l + r) / 2;
    update(left(node), l, mid, c, sum);
    update(right(node), mid + 1, r, c, sum);
    nodes[node] = Node(max(nodes[left(node)].val, nodes[right(node)].val));
  }
  int query() { return nodes[0].val; }
} tree;
int main() {
  cin >> n >> m >> p;
  a.resize(n);
  b.resize(m);
  for (int i = 0; i < n; i++) {
    cin >> a[i].first >> a[i].second;
  }
  for (int i = 0; i < m; i++) {
    cin >> b[i].first >> b[i].second;
  }
  for (int i = 0; i < p; i++) {
    int j = nxt(), k = nxt(), l = nxt();
    mon.push_back({j, {k, l}});
  }
  sort((a).begin(), (a).end());
  sort((b).begin(), (b).end());
  sort((mon).begin(), (mon).end());
  int ans = INT_MIN, ptr = 0;
  tree.build(0, 0, m - 1);
  for (int i = 0; i < n; i++) {
    while (ptr != p && mon[ptr].first < a[i].first) {
      int low = 0, high = m - 1;
      while (low != high) {
        int middle = (low + high) / 2;
        if (mon[ptr].second.first >= b[middle].first)
          low = middle + 1;
        else
          high = middle;
      }
      if (mon[ptr].second.first < b[low].first)
        tree.update(0, 0, m - 1, low, mon[ptr].second.second);
      ptr++;
    }
    ans = max(ans, -a[i].second + tree.query());
  }
  printf("%d\n", ans);
  return 0;
}
