#include template void scan(T &x) { register char ch; x = 0; for (ch = getchar(); ~ch && (ch < '0' || ch > '9'); ch = getchar()); for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; } typedef long long ll; const int MAXP = 2000; int n, m; int k[1005], p[1005]; struct Monster { int a, b; bool operator < (const Monster &rhs) const { return b < rhs.b; } void scan() { ::scan(a); ::scan(b); } } mons[100005]; int dp[2005]; int main() { while (~scanf("%d%d", &n, &m)) { for (int i = 1; i <= n; ++i) mons[i].scan(); for (int i = 1; i <= m; ++i) { scan(k[i]); scan(p[i]); } std::sort(mons + 1, mons + n + 1); int mx = 0; for (int i = 1; i <= m; ++i) mx = std::max(mx, p[i]); if (mx <= mons[n].b) { puts("-1"); continue; } ll ans = 0; for (int l = 1, r = 1, b = 0; b <= 10; ++b, l = r) { while (r <= n && mons[r].b == b) ++r; memset(dp, 0x7f, sizeof dp); dp[0] = 0; for (int i = 1; i <= m; ++i) { if ((p[i] - b) <= 0) continue; for (int j = (p[i] - b); j <= MAXP; ++j) dp[j] = std::min(dp[j], dp[j - (p[i] - b)] + k[i]); } for (int i = MAXP - 1; i; --i) dp[i] = std::min(dp[i], dp[i + 1]); for (int i = l; i < r; ++i) ans += dp[mons[i].a]; } std::cout << ans << std::endl; } return 0; }