#include <cstdio>
#include <utility>
#include <unordered_map>
#include <queue>
#include <vector>
#include <climits>
using namespace std;

#define gcu getchar_unlocked
#define pcu putchar_unlocked
#define _il inline
#define _in _il int in
#define _sc _il bool scan
_in(int c){int n=0;bool m=false;if(c=='-')m=true,c=gcu();
	do{n=10*n+(c-'0'),c=gcu();}while(c>='0');return m?-n:n;} //&&c<='9'
_in() {return in(gcu());}
_sc(int &n){int c=gcu();return c==EOF?false:(n=in(c),true);}
_sc(char &c){c=gcu();gcu();return c!=EOF;}
template <typename H,typename... T> _sc(H &h, T&&... t){return scan(h)&&scan(t...);}
#define _vo _il void out
#define _vl _il void outl
template <typename T>
_vo(T n){static char buf[20];char *p=buf;
	if(n<0)pcu('-'),n*=-1;if(!n)*p++='0';else while(n)*p++=n%10+'0',n/=10;
	while (p!=buf)pcu(*--p);}
_vo(const char *s){while(*s)pcu(*s++);}
_vo(char c){pcu(c);}
template <typename H,typename... T> _vo(H&& h, T&&... t){out(h);out(move(t)...);}
_vl(){out('\n');}
template <typename... T> _vl(T&&... t){out(move(t)...);outl();}

#define B(n) n = in()
typedef unordered_map<int, unordered_map<int, int>> R;

struct N {
	int n, c;
	bool operator < (const N &a) const {return a.c < c;}
};

int min_cost(int s, int g, int n, R &r) {
	priority_queue<N> q;
	vector<N> v(n + 1, {0, INT_MAX});
	for (q.push({s,0}) ;!q.empty();) {
		auto p = q.top(); q.pop();
		if (p.n == g) return p.c;
		if (v[p.n].n) continue;
		v[p.n].n = 1;
		for (auto n: r[p.n]) {
			int c = p.c + n.second;
			if (v[n.first].c > c)
				q.push({n.first, v[n.first].c = c});
		}
	}
	return -1;
}

int main() {
	int B(n), B(m);
	R r;
	while (m--) {
		int B(a), B(b), B(c), B(d);
		r[a][b] = c;
		r[b][a] = d;
	}
	int B(s), B(g), B(v), B(p);
	outl(v - p - min_cost(s, g, n, r) - min_cost(g, s, n, r));
}

