#include<iostream>
#include<queue>
#include<utility>
#include<stdio.h>
using namespace std;
typedef pair<int,int> P;
int main(){
  const int INF=(1<<29);
  int min[1010],fix[1010];
  int map[1010][1010];
  int s1,g1; //スタート地点の座標をs1,ゴール地点の座標をg1とおく
  int n,m,i,j,x,y,z1,z2,v,price; //nは頂点の本数,mは辺の本数
  priority_queue<P,vector<P>,greater<P> > que;  //greater<P>の右の空白は重要
  scanf("%d\n%d\n",&n,&m);
  for(i=0;i<=n;i++){
    min[i]=INF,fix[i]=0;
  }
  for(i=0;i<=n;i++){
    for(j=0;j<=n;j++){
      map[i][j]=-1;
    }
  }
  for(i=0;i<m;i++){
    scanf("%d,%d,%d,%d\n",&x,&y,&z1,&z2);
    if(map[x][y]==-1 || map[x][y]>z1){
    map[x][y]=z1;
    }
    if(map[y][x]==-1 || map[y][x]>z2){
    map[y][x]=z2;
    }
  }
  scanf("%d,%d,%d,%d\n",&s1,&g1,&v,&price);
  v=v-price;
  que.push(P(0,s1));
  min[s1]=0;
  while(!que.empty()){
    if(fix[g1]==1){
      break;
    }
    P p=que.top();
    que.pop();
    int v=p.second;
    if(min[v]<p.first){
      continue;
    }
    for(i=0;i<=n;i++){
      if(map[v][i]!=-1 && min[i]>min[v]+map[v][i] && fix[i]==0){
        min[i]=min[v]+map[v][i];
        que.push(P(min[v]+map[v][i],i));
      }
    }
    fix[v]=1;
  }
  v=v-min[g1];
  while(!que.empty()){
    que.pop();
  }
    for(i=0;i<=n;i++){
    min[i]=INF,fix[i]=0;
  }
  que.push(P(0,g1));
  min[g1]=0;
  while(!que.empty()){
    if(fix[s1]==1){
      break;
    }
    P p=que.top();
    que.pop();
    int v=p.second;
    if(min[v]<p.first){
      continue;
    }
    for(i=0;i<=n;i++){
      if(map[v][i]!=-1 && min[i]>min[v]+map[v][i] && fix[i]==0){
        min[i]=min[v]+map[v][i];
        que.push(P(min[v]+map[v][i],i));
      }
    }
    fix[v]=1;
  }
  v=v-min[s1];
  printf("%d\n",v);
  return 0;
}
