/*autor programu: Marek Cygan*/
/*data: 22.12.2005*/
/*opis: rozwiazanie wzorcowe z uzyciem STL'a*/
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>

#define MP make_pair
#define ST first
#define ND second
#define PB push_back
using namespace std;

const int N=101000,INF=1000000100;
typedef pair<int,int> PII;
vector<PII> graf_beg[N],graf_end[N];
int dist[N],n,a,b;
priority_queue<PII,vector<PII>,greater<PII> > q;

void czytaj(){
  int m,d;
  scanf("%d %d %d %d %d",&n,&m,&a,&b,&d);
  a--; b--; d--;
  for (int i=0; i<m; ++i){
    int a,b,c1,c2,d1,d2;
    scanf("%d %d %d %d %d %d",&a,&b,&c1,&d1,&c2,&d2);
    graf_beg[--a].PB(MP(--b,c1)); graf_beg[b].PB(MP(a,c2));
    graf_end[a].PB(MP(b,c1+d*d1)); graf_end[b].PB(MP(a,c2+d*d2));
  }
}

int dijkstra(vector<PII> *graf,int a,int b){
  for(int i=0; i<n;++i) dist[i]=INF;
  dist[a]=0; q.push(MP(0,a));
  while (!q.empty()){
    PII p=q.top(); q.pop();
    if (p.ST==dist[p.ND])
      for(int i=0; i<(int)graf[p.ND].size(); ++i){
        int v=graf[p.ND][i].ST;
        int d=dist[p.ND]+graf[p.ND][i].ND;
        if (d<dist[v]) q.push(MP(dist[v]=d,v));
      }
  }
  return dist[b];
}

int main(){
  czytaj();
  printf("%d\n",min(dijkstra(graf_beg,a,b)+dijkstra(graf_beg,b,a),
                    dijkstra(graf_end,a,b)+dijkstra(graf_end,b,a)));
}
