#include <iostream>
#include <algorithm>
using namespace std;

#define MAX_V 20
const int INF = 1<<20;

int cost[MAX_V][MAX_V];
int V;
bool used[MAX_V];  // 最小距離の確定した頂点
int d[MAX_V];

void dijkstra(int s) {
  fill(d, d+V, INF);
  fill(used, used+V, false);
  
  d[s] = 0;
  while(true) {
    int v = -1;
    for(int u=0; u<V; u++) {
      // 最小が確定していない頂点からd[v]を最小距離であることが確定させる
      if(!used[u] && ( v == -1 || d[u] < d[v] ) ) v = u;
    }
    if(v == -1) {
      // 全ての頂点の最小距離が確定
      break;
    }
    used[v] = true;
    

    
    // 上で確定させた最小距離の頂点から伸びうる頂点を更新しておく
    for(int u=0; u<V; u++) {
      d[u] = min(d[u], d[v]+cost[v][u]);
    }
  }
}

int main() {
  int m;

  cin >> V >> m;

  for(int i=0; i<V; i++) {
    for(int j=0; j<V; j++) {
      cost[i][j] = INF;
    }
  }
  
  for(int i=0; i<m; i++) {
    int a, b;
    char c1, c2;
    cin >> a >> c1 >> b >> c2; a--, b--;
    cin >> cost[a][b] >> c1 >> cost[b][a];
  }
  
  int x1, x2, y1, y2;
  char c1,c2,c3;
  cin >> x1 >> c1 >> x2 >> c2 >> y1 >> c3 >> y2; x1--, x2--;
  
  dijkstra(x1);
  
  int money = y1-(y2+d[x2]);
  
  dijkstra(x2);
  
  money -= d[x1];
  cout << money << endl;
  
  return 0;
}