#include <iostream>
#include <queue>
#include <stdio.h>
using namespace std;
#define MAX 100000
#define WHITE 0
#define GRAY 1
#define BLACK 2

// 重み付き有向グラフの隣接リスト
vector<pair<int,int> > adj[MAX];

int dijkstra(vector<pair<int,int> >* adj,int n,int startIndex,int dest){
    priority_queue<pair<int,int> >pq;
    // weight[v]に始点sからvまでの最短コストを保存する
    int weight[MAX];
    // 訪問状態を記録
    int color[MAX];
    // 1.初期化
    for(int i = 0;i < n;++i){
        weight[i] = __INT_MAX__;
        color[i] = WHITE;
    }
    
    // 始点
    weight[startIndex] = 0;
    color[startIndex] = GRAY;
    pq.push(make_pair(0,startIndex));
    
    // 2
    while(!pq.empty()){
        // 2.1最小である頂点の決定
        pair<int,int> first = pq.top();
        pq.pop();
        // 頂点
        int u = first.second;
        color[u] = BLACK;
        // 最短値を取りだして、最短でなければ飛ばす
        if(weight[u] < first.first * -1) continue;
        // uに隣接する頂点vが存在する限り最短店を更新する
        for(int i = 0;i < adj[u].size();++i){
            int v = adj[u][i].first;
            if(color[v] == BLACK)continue;
            // 2.2最短点の更新
            if(weight[v] > weight[u] + adj[u][i].second){
                weight[v] = weight[u] + adj[u][i].second;
                // priority_queueはデフォルトで大きい値を優先するので-にする
                pq.push(make_pair(weight[v] * -1, v));
                color[v] = GRAY;
            }
        }
    }
    return weight[dest];
}

int main(){
    int begin,vNum,eNum,dest,salary,cost,totalCost = 0;
    cin >> vNum;
    cin >> eNum;

    int s,t,d1,d2;
    for(int i = 0;i < eNum;++i){
        scanf("%d,%d,%d,%d",&s,&t,&d1,&d2);
        adj[s - 1].push_back(make_pair(t - 1,d1));
        adj[t - 1].push_back(make_pair(s - 1,d2));
    }
    scanf("%d,%d,%d,%d",&begin,&dest,&salary,&cost);
    totalCost += dijkstra(adj,vNum,begin - 1,dest - 1);
    totalCost += dijkstra(adj,vNum,dest - 1,begin - 1);
    int ans = salary - (cost + totalCost);
    cout << ans << endl;
}

