//Head and Prepare
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define ull unsigned long long
#define il inline
#define maxm 200010
#define maxq 1010
#define maxn 100010
#define inf 0x3fffffff
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize("inline")
#define re register
using namespace std;
il int read()
{
int x=0;char c=getchar();
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x;
}
//coding Start
struct Line
{
int EndStation,StartTime,EndTime;
};
vector<Line> station[maxn];
inline bool cmp(Line a,Line b)
{
return a.StartTime>b.StartTime;
}
int n,m,A,B,C;
int dp[maxn][1001];//到某站,某时间
inline int Figdety(int x,int y)
{
return A*(y-x)*(y-x)+B*(y-x)+C;
}
void Dp(int u,int time,int figdety)
{
if(figdety>dp[u][time])return;
dp[u][time]=figdety;
for(re int i=0;i<station[u].size();i++)
{
int v=station[u][i].EndStation;
if(station[u][i].StartTime<time)break;
int F=Figdety(time,station[u][i].StartTime);
Dp(v,station[u][i].EndTime,figdety+F);
}
}
void Input()
{
n=read(),m=read(),A=read(),B=read(),C=read();
for(re int i=1,x,y,p,q;i<=m;i++)
{
x=read(),y=read(),p=read(),q=read();
station[x].push_back((Line){y,p,q});
}
}
int main()
{
Input();
for(re int i=1;i<=n;i++)
sort(station[i].begin(),station[i].end(),cmp);
for(re int i=1;i<=n;i++)
for(re int j=0;j<=1000;j++)
dp[i][j]=inf;
Dp(1,0,0);
int ans=inf;
for(re int i=0;i<=1000;i++)
ans=min(ans,dp[n][i]+i);
cout<<ans<<endl;
return 0;
}