#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;
}