#include <bits/stdc++.h>
using namespace std;
long long n, m, A, B, C;
long long dp[10005], ans = 0x7fffffffffffffff;
struct Train
{
long long x, y, p, q;
int No;
inline bool operator<(const Train &x) const //重载运算符
{
return x.q < q;
}
} train[1000005];
deque<int> que[100005];
priority_queue<Train> heap;
inline bool cmp(Train x, Train y)
{
return x.p == y.q ? x.q < y.q : x.p < y.p;
}
inline double slope(int a, int b)
{
return (double)(dp[a] + A * train[a].q * train[a].q - B * train[a].q - dp[b] - A * train[b].q * train[b].q + B * train[b].q) / (double)(train[a].q - train[b].q);
}
int main()
{
memset(dp, 127, 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", &train[i].x, &train[i].y, &train[i].p, &train[i].q);
}
sort(train + 1, train + m + 1, cmp);
for (int i = 1; i <= m; i++)
{
train[i].No = i, heap.push(train[i]);
if (train[i].x == 1)
dp[i] = A * train[i].p * train[i].p + B * train[i].p + C;
}
for (int i = 1; i <= m; i++)
{
int s = train[i].x, e, t = 0;
if (!heap.empty())
while (heap.top().q <= train[i].p)
{
e = heap.top().y;
if (que[e].size() > 1)
while (slope(heap.top().No, *(que[e].begin() + 1)) <= slope(*(que[e].begin()), *(que[e].begin() + 1)))
{
que[e].pop_front();
if (que[e].size() < 2)
break;
}
que[e].push_front(heap.top().No);
heap.pop();
if (heap.empty())
break;
}
if (que[s].size() > 1)
while (slope(*(que[s].end() - 2), *(que[s].end() - 1)) <= 2 * A * train[i].p)
{
que[s].pop_back();
if (que[s].size() < 2)
break;
}
if (!que[s].empty())
{
t = train[i].p - train[*(que[s].end() - 1)].q;
dp[i] = min(dp[*(que[s].end() - 1)] + A * t * t + B * t + C, dp[i]);
}
}
for (int i = 1; i <= m; i++)
{
if (train[i].y == n)
ans = min(ans, dp[i] + train[i].q);
}
printf("%lld\n", ans);
return 0;
}