#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
int x , y , p , q;
bool operator < (const node &qwq)
{
return p < qwq.p;
}
}e[1000010];
int n , m , A , B , C , dp[1000010] , path[1000010] , q[1000010] , head = 1 , tail = 1;
int X(int x)
{
return e[x].q;
}
int Y(int x)
{
return dp[x] + A * e[x].q * e[x].q - B * e[x].q;
}
double k(int x , int y)
{
if(X(x) == X(y))
{
if(Y(x) < Y(y)) return 1e18;
else return -1e18;
}
return 1.0 * (Y(x) - Y(y)) / (X(x) - X(y));
}
signed main()
{
memset(dp , 0x3f , sizeof(dp));
scanf("%lld%lld%lld%lld%lld" , &n , &m , &A , &B , &C);
for(int i = 1 ; i <= m ; i ++) scanf("%lld%lld%lld%lld" , &e[i].x , &e[i].y , &e[i].p , &e[i].q);
sort(e + 1 , e + m + 1);
for(int i = 1 ; i <= m ; i ++) if(e[i].x == 1) dp[i] = min(dp[i] , A * e[i].p * e[i].p + B * e[i].p + C) , q[++ tail] = i;
for(int i = 1 ; i <= m ; i ++)
{
while(head < tail && (k(q[head] , q[head + 1]) < 2 * A * e[i].p || e[i].x != e[q[head]].y || e[i].p < e[q[head]].q)) head ++;
int tmp = e[i].p - e[q[head]].q;
if(e[i].x == e[q[head]].y && tmp >= 0) dp[i] = min(dp[i] , dp[q[head]] + A * tmp * tmp + B * tmp + C);
while(head < tail && (k(q[tail - 1] , q[tail]) > k(q[tail] , i))) tail --;
q[++ tail] = i;
}
int ans = 1e18;
for(int i = 1 ; i <= m ; i ++) if(e[i].y == n) ans = min(ans , dp[i] + e[i].q);
printf("%lld\n" , ans);
return 0;
}