#include<bits/stdc++.h>
using namespace std;
#ifndef LOCAL
#define eprintf(...) fprintf(stderr, _VA_ARGS_)
#else
#define eprintf(...) 42
#endif
typedef long long ll;
typedef pair<int , int> pii;
typedef pair<ll , int> pli;
typedef pair<ll , ll> pll;
typedef long double ld;
typedef vector< int > vi;
typedef unsigned long long ull;
#define mp make_pair
#define fi first
#define se second
const int N = 2e6 + 10;
const int INF = 2e9;
struct info {
int u , v;
int L , R;
} a[N];
struct edge {
int to , w , nxt;
} e[N << 1];
int n , m , S , T , tot , A , B , C;
int head[N] , dist[N];
bool visited[N];
template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x) {
T f = 1; x = 0;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
x *= f;
}
inline void addedge(int u , int v , int w) {
++tot;
e[tot] = (edge){v , w , head[u]};
head[u] = tot;
}
inline void dijkstra(int s) {
priority_queue< pii , vector< pii > , greater< pii > > q;
q.push(mp(0 , s));
for (int i = 1; i <= T; ++i)
dist[i] = INF;
dist[s] = 0;
while (!q.empty()) {
int cur = q.top().se; q.pop();
if (visited[cur]) continue;
visited[cur] = true;
for (int i = head[cur]; i; i = e[i].nxt) {
int v = e[i].to , w = e[i].w;
if (dist[cur] + w < dist[v]) {
dist[v] = dist[cur] + w;
q.push(mp(dist[v] , v));
}
}
}
}
int main() {
// #ifndef evenbao
// freopen("route.in" , "r" , stdin);
// freopen("route.out" , "w" , stdout);
// #endif
read(n); read(m); read(A); read(B); read(C);
for (int i = 1; i <= m; ++i) {
read(a[i].u);
read(a[i].v);
read(a[i].L);
read(a[i].R);
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= m; ++j) {
if (i == j) continue;
if (a[j].u == a[i].v && a[j].L >= a[i].R)
addedge(i , j , A * (a[j].L - a[i].R) * (a[j].L - a[i].R) + B * (a[j].L - a[i].R) + C);
}
}
S = m + 1 , T = S + 1;
for (int i = 1; i <= m; ++i)
if (a[i].u == 1) addedge(S , i , A * a[i].L * a[i].L + B * a[i].L + C);
for (int i = 1; i <= m; ++i)
if (a[i].v == n) addedge(i , T , a[i].R);
dijkstra(S);
printf("%d\n" , dist[T]);
return 0;
}