#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
#define INF 1000000007
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
typedef pair<llong, llong> LP;
typedef pair<int, P> PP;
typedef pair<llong, LP> LPP;
typedef pair<ll,int> LL_IP;


#define ARRAY_MAX 101





typedef struct edge{
    int from;
    int to;
    int cost;
}EDGE;


/*頂点sから各頂点への最短距離を求めること、頂点sから到達できる負閉路があれば真が返る、目的地が決まっているバージョン*/
/*V-1回の更新で各ノードへの最短距離は求められる*/
/*V回目から2V回目までに最短距離が更新される場合は目的地を含む負閉路が存在する*/
bool shortest_path(int v,int e,int s,int t,vector<EDGE>& arr,vector<int>& d){
    /*頂点の個数、辺の個数、始点となる頂点、目的地の頂点、辺の情報、最短距離*/
    for(int i = 0;i < d.size();i++){
        d[i] = INF;
    }
    d[s]=0;
    
    for(int i = 0;i < 2*v;i++){
        for(int j = 0;j < e;j++){
            EDGE tmp = arr[j];
            if(d[tmp.from] != INF && d[tmp.to] > d[tmp.from] + tmp.cost){
                d[tmp.to] = d[tmp.from] + tmp.cost;
                if(i >= v-1 && tmp.to == t){
                    return true;
                }

            }
        }
    }
    return false;
}





int main(){


    int n,m,a,b,c,d;
    int s,g,v,p;
    char t;
    cin >> n >> m;
   
    vector<EDGE> G;/*n個の各頂点からそれ以外の頂点へのコスト*/
    vector<int> d1(n,INF);/*出発地点から柱までの最短経路*/
    vector<int> d2(n,INF);/*柱から出発地点までの最短経路*/

    
    REP(i,m){
        cin >> a >> t >> b >> t >> c >> t >> d;

        a--;
        b--;/*配列の添え字へ合わせる*/
        EDGE e1 = {a,b,c};
        EDGE e2 = {b,a,d};
        G.push_back(e1);
        G.push_back(e2);
    }
    /*グラフの作成が終了*/

    cin >> s >> t >> g >> t >> v >> t >> p;
    s--;
    g--;/*配列の添え字に合わせる*/

   
    bool ans1 = shortest_path(n,m*2,s,g,G,d1);
    bool ans2 = shortest_path(n,m*2,g,s,G,d2);

    /*REP(i,n){
        cout << d1[i] << " ";
    }
    cout << endl;

    REP(i,n){
        cout << d2[i] << " ";
    }
    cout << endl;
    cout << g << s << endl;
    cout << d1[g] << " " << d2[s] << endl;
    */
     
    ll ans = v - p - d1[g] - d2[s];
    cout << ans << endl;

    return 0;
}
