#include <bits/stdc++.h>
using namespace std;
int a, m, n, memo[2050][2050][5], umb[2050];
pair<int, int> w[2050];
int raining[2050];
vector<pair<int, int> > tl;
const int pinf = 1 << 28;
int dp(int x, int udx, bool shielded) {
  if (x == a) return shielded || !raining[x] ? 0 : pinf;
  if (raining[x] && !shielded && w[x].first == pinf) return pinf;
  int &sol = memo[x][udx][shielded];
  if (sol != -1) return sol;
  if (raining[x]) {
    if (shielded) {
      if (raining[x] != raining[x + 1]) {
        sol = min(dp(x + 1, udx, true) + umb[udx], dp(x + 1, 0, false));
      } else {
        sol = dp(x + 1, udx, true) + umb[udx];
      }
      if (w[x].first != pinf) {
        sol = min(sol, dp(x, w[x].second, true));
      }
    } else {
      sol = dp(x, w[x].second, true);
    }
  } else {
    sol = min(shielded ? dp(x + 1, 0, false) : pinf,
              dp(x + 1, udx, shielded) + (shielded ? umb[udx] : 0));
    if (w[x].first != pinf) {
      sol = min(sol, dp(x, w[x].second, true));
    }
  }
  return sol;
}
int main() {
  scanf("%d%d%d", &a, &n, &m);
  for (int i = 0; i < n; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    for (int x = l; x <= r; x++) raining[x] = r;
  }
  memset(memo, -1, sizeof memo);
  for (int i = 0; i < 2050; i++) w[i] = make_pair(pinf, pinf);
  for (int i = 1; i <= m; i++) {
    int x, p;
    scanf("%d%d", &x, &p);
    w[x] = make_pair(min(p, w[x].first), i);
    umb[i] = min(w[x].first, p);
  }
  int sol = dp(0, 1, false);
  printf(sol >= pinf ? "-1\n" : "%d\n", sol);
}
