#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
struct sides{
    int t;
    int v;
};
struct ts{
    int f;
    int t;
    int v;
    void cpy(sides s){
        t=s.t;
        v=s.v;
    };
};
int main(){
    int n,m,p,q,s,e,ans,value[21];
    sides temp[2];
    vector<sides> a[21];
    ts t,b;
    queue<ts> unsolved;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        scanf("%d,%d,%d,%d",&temp[0].t,&temp[1].t,&temp[1].v,&temp[0].v);
        temp[0].t--;
        temp[1].t--;
        a[temp[0].t].push_back(temp[1]);
        a[temp[1].t].push_back(temp[0]);
    }
    scanf("%d,%d,%d,%d",&s,&e,&p,&q);
    s--;
    e--;
    ans=p-q;
    for(int i=0;i<a[s].size();i++){
        t.cpy(a[s][i]);
        t.f=s;
        unsolved.push(t);
    }
    for(int i=0;i<n;i++)value[i]=-1;
    value[s]=0;
    while(!unsolved.empty()){
        t=unsolved.front();
        unsolved.pop();
        if(value[t.t]!=-1&&value[t.t]<value[t.f]+t.v)continue;
        value[t.t]=value[t.f]+t.v;
        b=t;
        for(int i=0;i<a[b.t].size();i++){
            t.cpy(a[b.t][i]);
            t.f=b.t;
            unsolved.push(t);
        }
    }
    ans-=value[e];
    for(int i=0;i<a[e].size();i++){
        t.cpy(a[e][i]);
        t.f=e;
        unsolved.push(t);
    }
    for(int i=0;i<n;i++)value[i]=-1;
    value[e]=0;
    while(!unsolved.empty()){
        t=unsolved.front();
        unsolved.pop();
        if(value[t.t]!=-1&&value[t.t]<value[t.f]+t.v)continue;
        value[t.t]=value[t.f]+t.v;
        b=t;
        for(int i=0;i<a[b.t].size();i++){
            t.cpy(a[b.t][i]);
            t.f=b.t;
            unsolved.push(t);
        }
    }
    ans-=value[s];
    printf("%d\n",ans);
}