#include<cstdio>
#include<algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

typedef long long ll;

#define ceil(a,b) ((a+b-1)/(b))

struct enemy{
	int c,d,s; // ツ倒ツつキツづ慊づ?づ可叩ツつュツづ猟つォツ嘉アツ青? ツ暗ェツ嘉アツづ個攻ツ個つづ?篠ゥツ閉ェツつェツ偲ウツつッツづゥツダツδ?ーツジ, ツ敏ツ渉キツ度
	bool operator<(const enemy &e)const{ return (ll)c*e.d<(ll)d*e.c; }
};

int main(){
	int n; scanf("%d",&n);
	int h[40001],a[40001],d[40001],s[40001];
	rep(i,n+1) scanf("%d%d%d%d",h+i,a+i,d+i,s+i);

	// ツ鳴ウツ敵ツづ個敵ツづ可づつつ「ツづ?療。ツ外ツ渉按猟?
	rep(i,n) if(a[0]<=d[i+1]) {
		if(d[0]<a[i+1]){ // ツ鳴ウツ敵ツづ個敵ツつゥツづァツダツδ?ーツジツづーツ偲ウツつッツづゥツづ按づァツ閉可つッツづゥツつオツつゥツづ按つ「
			puts("-1");
			return 0;
		}
		else{ // ツ鳴ウツ敵ツづ個敵ツつゥツづァツダツδ?ーツジツづーツ偲ウツつッツづ按つ「ツづ按づァツつサツづアツづ按敵ツづ債つ「ツづ按つ「ツつアツづ?づ可つオツづ?つオツづ慊つ、
			swap(h[i+1],h[n]);
			swap(a[i+1],a[n]);
			swap(d[i+1],d[n]);
			swap(s[i+1],s[n]);
			n--;
			i--;
		}
	}

	int n_tmp=0;
	enemy E[40000];
	rep(i,n){
		if(a[i+1]<=d[0]) continue;
		E[n_tmp].c=ceil(h[i+1],a[0]-d[i+1]);
		E[n_tmp].d=a[i+1]-d[0];
		E[n_tmp].s=s[i+1];
		n_tmp++;
	}
	n=n_tmp;

	sort(E,E+n);

	ll dmg=0;
	// 1 ツタツーツδ督姪堋づ可篠ゥツ閉ェツづヲツづィツ堕ャツつ「ツ敵ツづ個攻ツ個つづーツ偲ウツつッツづゥ
	rep(i,n) if(s[0]<E[i].s) {
		dmg+=E[i].d;
		dmg=min(dmg,(ll)h[0]);
	}
	// ツつオツつゥツづゥツづ猟つォツ渉?づ?敵ツづーツ倒ツつオツつスツづ?つォツづ個債?計ツ氾ュツダツδ?ーツジツづーツ計ツ算
	ll c_sum=0;
	rep(i,n){
		c_sum+=E[i].c;
		c_sum=min(c_sum,2000000000LL);
		dmg+=(c_sum-1)*E[i].d;
		dmg=min(dmg,(ll)h[0]);
	}
	if(h[0]<=dmg) puts("-1");
	else          printf("%lld\n",dmg);

	return 0;
}