#include <bits/stdc++.h>
#define F first
#define S second
#define INF 1 << 21
using namespace std;
typedef struct{
  int to;int cost;
}Edge;
typedef pair<int,int> P;
priority_queue<P, vector<P>, greater<P> > pq;
int main(){
  int d[11111];
  int n,m;
  int ans;
  char ch;
  int a,b,c,z;
  int st,go,hasira,money;
  vector<Edge> G[111];
  cin >> n;
  cin >> m;
  fill(d,d+m,INF);
  for(int i=0;i<m;i++){
    cin >> a >> ch >> b >> ch >> c >> ch >> z;
    G[a].push_back( (Edge){ b,c});
    G[b].push_back( (Edge){ a,z});
  }
  
  cin >> st >> ch >> go >> ch >> money >> ch >> hasira;
  d[st]=0;//出発地点の自明
  pq.push(P(0,st));
  
  while(!pq.empty()){
    P p=pq.top();
    pq.pop();
    int v=p.S;//使っていないところからの最短距離について調べる
    if(d[v]<p.first)continue; //すでに今までのが小さいならみなくてもいい
    for(int i=0;i<G[v].size()/*そこからつながっている道の数わかっちゃうやつ*/;i++){
      Edge e=G[v][i];
      if(d[e.to] > d[v] + e.cost){
	d[e.to] = d[v] + e.cost;
	pq.push(P(d[e.to],e.to));
      }
    }
  }

  ans=d[go];
  
  /*帰り道*/
  fill(d,d+m,INF);

  d[go]=0;//出発地点の自明
  pq.push(P(0,go));
  
  while(!pq.empty()){
    P p=pq.top();
    pq.pop();
    int v=p.S;//使っていないところからの最短距離について調べる
    if(d[v]<p.first)continue; //すでに今までのが小さいならみなくてもいい
    for(int i=0;i<G[v].size()/*そこからつながっている道の数わかっちゃうやつ*/;i++){
      Edge e=G[v][i];
      if(d[e.to] > d[v] + e.cost){
	d[e.to] = d[v] + e.cost;
	pq.push(P(d[e.to],e.to));
      }
    }
  }
  ans+=d[st];
  
  cout << money-ans-hasira << endl;
}