#include <bits/stdc++.h>
using namespace std;
const int sz = 3e3;
int x, umbNum, rain;
vector<pair<int, int> > seg;
vector<pair<int, int> > umb;
long long dp[sz][sz];
int umbLoc[sz];
bitset<sz> isRain;
void input() {
  cin >> x >> rain >> umbNum;
  for (int i = 0; i < rain; i++) {
    int l, r;
    cin >> l >> r;
    seg.push_back({l, r});
    for (int j = l; j < r; j++) isRain[j] = 1;
  }
  sort(seg.begin(), seg.end());
  for (int i = 0; i < sz; i++) umbLoc[i] = -1;
  for (int i = 0; i < umbNum; i++) {
    int loc, w;
    cin >> loc >> w;
    if (umbLoc[loc] == -1 || umbLoc[loc] > w) umbLoc[loc] = w;
  }
  umb.push_back({-1, 0});
  for (int i = 0; i < sz; i++) {
    if (umbLoc[i] != -1) {
      umb.push_back({i, umbLoc[i]});
      umbLoc[i] = umb.size() - 1;
    }
  }
  umbNum = umb.size() - 1;
  for (int i = 0; i < sz; i++) {
    for (int j = 0; j < sz; j++) dp[i][j] = 1e17;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  input();
  for (int i = x; i >= 0; i--) {
    for (int myUmb = umbNum; myUmb >= 0; myUmb--) {
      if (i == x)
        dp[i][myUmb] = 0;
      else {
        if (myUmb == 2) {
          myUmb++;
          myUmb--;
        }
        if (umb[myUmb].first > i) continue;
        if (myUmb) dp[i][myUmb] = dp[i + 1][myUmb] + umb[myUmb].second;
        if (umbLoc[i] != -1) dp[i][myUmb] = min(dp[i][myUmb], dp[i][umbLoc[i]]);
        if (!isRain[i]) dp[i][myUmb] = min(dp[i][myUmb], dp[i + 1][0]);
      }
    }
  }
  cout << (dp[0][0] > 1e10 ? -1 : dp[0][0]) << endl;
  return 0;
}
