#include <bits/stdc++.h>
namespace IPT {
const int L = 1000000;
char buf[L], *front = buf, *end = buf;
char GetChar() {
  if (front == end) {
    end = buf + fread(front = buf, 1, L, stdin);
    if (front == end) return -1;
  }
  return *(front++);
}
}  // namespace IPT
template <typename T>
inline void qr(T &x) {
  char ch = IPT::GetChar(), lst = ' ';
  while ((ch > '9') || (ch < '0')) lst = ch, ch = IPT::GetChar();
  while ((ch >= '0') && (ch <= '9'))
    x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
  if (lst == '-') x = -x;
}
namespace OPT {
char buf[120];
}
template <typename T>
inline void qw(T x, const char aft, const bool pt) {
  if (x < 0) {
    x = -x, putchar('-');
  }
  int top = 0;
  do {
    OPT::buf[++top] = static_cast<char>(x % 10 + '0');
  } while (x /= 10);
  while (top) putchar(OPT::buf[top--]);
  if (pt) putchar(aft);
}
const int maxn = 200005;
const int maxt = 1000005;
const int INF = 2000000005;
int n, m, p, upc;
int ans = -INF;
int fee[maxt];
struct M {
  int x, y, z;
  inline bool operator<(const M &o) const { return x < o.x; }
  inline void init() {
    qr(x);
    qr(y);
    qr(z);
  }
};
M MU[maxn];
struct N {
  int x, y;
  inline void init() {
    qr(x);
    qr(y);
  }
  inline bool operator<(const N &o) const { return x < o.x; }
};
N a[maxn], b[maxn];
struct Node {
  int l, r;
  int v, tag;
  Node *ls, *rs;
  inline void maketag(const int V) {
    v += V;
    tag += V;
  }
  inline void pushup() { v = std::max(rs->v, ls->v); }
  inline void pushdown() {
    if (tag) {
      ls->maketag(tag);
      rs->maketag(tag);
      tag = 0;
    }
  }
  Node(const int L, const int R) : l(L), r(R), tag(0) {
    if (l == r) {
      v = fee[l];
      ls = rs = nullptr;
    } else {
      int M = (L + R) >> 1;
      ls = new Node(L, M), rs = new Node(M + 1, R);
      pushup();
    }
  }
  void update(const int p, const int V) {
    if (l >= p) {
      maketag(V);
      return;
    }
    pushdown();
    rs->update(p, V);
    if (ls->r >= p) {
      ls->update(p, V);
    }
    pushup();
  }
};
int main() {
  ;
  qr(n);
  qr(m);
  qr(p);
  for (int i = 1; i <= n; ++i) {
    a[i].init();
  }
  for (int i = 1; i <= m; ++i) {
    b[i].init();
  }
  for (int i = 1; i <= p; ++i) {
    MU[i].init();
  }
  std::sort(a + 1, a + 1 + n);
  std::sort(b + 1, b + 1 + m);
  std::sort(MU + 1, MU + 1 + p);
  upc = b[m].x;
  std::fill_n(fee + 1, (upc = b[m].x) + 1, -INF);
  for (int i = upc, j = m, di = i + 1; i; di = i--) {
    while (j && (b[j].x == i)) {
      fee[i] = std::max(fee[i], -b[j--].y);
    }
    fee[i] = std::max(fee[i], fee[di]);
  }
  auto rot = new Node(1, upc);
  for (int i = 1, j = 1; i <= n; ++i) {
    while ((j <= p) && (MU[j].x < a[i].x)) {
      if (MU[j].y < upc) rot->update(MU[j].y + 1, MU[j].z);
      ++j;
    }
    ans = std::max(ans, rot->v - a[i].y);
  }
  qw(ans, '\n', true);
  return 0;
}
