#include using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int N = 100005; struct guai { int a,b,c; operator < (const guai &p)const { return c < p.c; } }x[N]; struct ji { int k,p; operator < (const ji &t)const { if(p == t.p) return k < t.k; return p < t.p; } }y[N]; ll dp[1005][15]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { ll sum = 0,ans = 0; int maxn = 0; for(int i = 1;i <= n;i++) scanf("%d%d",&x[i].a,&x[i].b),x[i].c = x[i].a+x[i].b,sum += x[i].a+x[i].b; for(int i = 1;i <= m;i++) scanf("%d%d",&y[i].k,&y[i].p),maxn = max(maxn,y[i].p); bool flag = true; for(int i = 1;i <= n;i++) { if(x[i].b >= maxn) { flag = false; break; } } if(!flag) { printf("-1\n"); continue; } /* sort(x+1,x+1+n); sort(y+1,y+1+m); ll ans = 0; for(int i = 1;i <= n;i++) { for(int j = 1;j <= m;j++) { if(vis[j]) continue; if(x[i].c > 0) ans += y[j].k,x[i].c -= y[j].p,vis[j] = true;; } }*/ memset(dp,0x3f,sizeof(dp)); for(int j = 0;j <= 10; j++) dp[0][j] = 0; for(int i = 1;i <= m;i++) { for(int j = 0;j <= 10;j++) { if(y[i].p - j <= 0)//防御力大于伤害 continue; for(int k = 0;k <= 1000;k++) if(k-(y[i].p-j) <= 0) dp[k][j] = min(dp[k][j],1ll*y[i].k); else dp[k][j] = min(dp[k][j],dp[k-(y[i].p-j)][j]+y[i].k); } } for(int i = 1;i <= n;i++) ans += dp[x[i].a][x[i].b]; printf("%lld\n",ans); } return 0; }