#include <bits/stdc++.h>
using namespace std;
inline long long add(long long a, long long b) {
  return ((a % 1000000007LL) + (b % 1000000007LL)) % 1000000007LL;
}
inline long long mul(long long a, long long b) {
  return ((a % 1000000007LL) * (b % 1000000007LL)) % 1000000007LL;
}
inline long long sub(long long a, long long b) {
  return ((a % 1000000007LL) - (b % 1000000007LL) + 1000000007LL) %
         1000000007LL;
}
long long zVal = 2005;
long long dp[2010][2010][2];
long long rain[2010];
unordered_map<long long, long long> um;
long long a;
long long findMin(long long i, long long j, long long k) {
  long long addFatigue = um[j];
  if (i == a) {
    return addFatigue;
  }
  if (dp[i][j][k] != -1) {
    return dp[i][j][k];
  }
  long long ret = 100000000000000LL;
  if (k) {
    if (um[i]) {
      if (um[j] > um[i]) {
        j = i;
      }
    }
  } else {
    if (um[i]) {
      j = i;
    }
  }
  if (rain[i]) {
    if (!k) {
      if (um[j]) {
        ret = findMin(i + 1, j, 1) + addFatigue;
      }
    } else {
      ret = findMin(i + 1, j, 1) + addFatigue;
    }
  } else {
    ret = findMin(i + 1, zVal, 0) + addFatigue;
    if (um[j]) {
      ret = min(ret, findMin(i + 1, j, 1) + addFatigue);
    }
  }
  return dp[i][j][k] = ret;
}
void Flash() {
  memset(dp, -1, sizeof(dp));
  memset(rain, 0, sizeof(rain));
  long long n, m;
  cin >> a >> n >> m;
  long long x, y;
  for (long long i = 0; i < n; i++) {
    cin >> x >> y;
    ++rain[x], --rain[y];
  }
  for (long long i = 1; i <= a; i++) {
    rain[i] += rain[i - 1];
  }
  for (long long i = 0; i < m; i++) {
    cin >> x >> y;
    if (um[x] == 0) {
      um[x] = y;
    } else {
      um[x] = min(um[x], y);
    }
  }
  long long ans = 100000000000000LL;
  ans = min(ans, findMin(0, zVal, 0));
  if (ans == 100000000000000LL) {
    ans = -1;
  }
  cout << ans << "\n";
}
int main(int argc, char const *argv[]) {
  ios::sync_with_stdio(0), cin.tie(NULL), cout.tie(NULL);
  ;
  long long t = 1;
  for (long long i = 1; i <= t; i++) {
    Flash();
  }
  return 0;
}
