#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
const long long oo = 1e18;
int n, m, s, t;
struct DATA{
int v, f, id;
};
vector < DATA > E[N];
bool cmp(DATA A, DATA B){
return A.f < B.f;
}
struct Graph{
int u, v, w, f;
} a[N];
struct dinh{
int u, tp;
};
vector < pair<dinh, long long> > G[N][2];
struct kmv{
long long du;
int u, tp;
bool operator > (kmv A){
return du > A.du;
}
};
long long d[N][2];
void dijkstra(){
for (int i = 1; i <= m; i ++)
d[i][0] = d[i][1] = oo;
priority_queue <kmv, vector<kmv>, greater<> > pq;
for (int i = 1; i <= m; i ++){
if (a[i].u == s){
d[i][0] = 0;
pq.push({0, i, 0});
}
else
if (a[i].v == s){
d[i][1] = 0;
pq.push({0, i, 1});
}
}
while (pq.size()){
kmv val = pq.top();
pq.pop();
long long du = val.du;
int u = val.u;
int tp = val.tp;
if (du != d[u][tp])
continue;
for (pair<dinh, long long> i : G[u][tp]){
int v = i.first.u;
int ntp = i.first.tp;
long long w = i.second;
long long dv = du + w;
if (d[v][ntp] > dv){
d[v][ntp] = dv;
pq.push({dv, v, ntp});
}
}
}
}
void SOLVE(){
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i ++){
int u, v, w, f;
cin >> u >> v >> w >> f;
if (u > v)
swap(u, v);
a[i] = {u, v, w, f};
E[u].push_back({v, f, i});
E[v].push_back({u, f, i});
G[i][0].push_back({{i, 1}, w});
G[i][1].push_back({{i, 0}, w});
}
for (int i = 1; i <= n; i ++){
sort(E[i].begin(), E[i].end(), cmp);
for (int j = 0; j + 1 < (int) E[i].size(); j ++){
int id1 = E[i][j].id;
int tp1 = -1;
if (a[id1].u == i)
tp1 = 0;
else
tp1 = 1;
int id2 = E[i][j + 1].id;
int tp2 = -1;
if (a[id2].u == i)
tp2 = 0;
else
tp2 = 1;
int w = E[i][j + 1].f - E[i][j].f;
G[id1][tp1].push_back({{id2, tp2}, w});
G[id2][tp2].push_back({{id1, tp1}, w});
}
}
dijkstra();
long long ans = oo;
for (int i = 1; i <= m; i ++)
if (a[i].u == t)
ans = min(ans, d[i][0]);
else
if (a[i].v == t)
ans = min(ans, d[i][1]);
if (ans == oo)
ans = -1;
cout << ans;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#define TASK "message"
if (fopen(TASK".inp","r")){
freopen(TASK".inp","r",stdin);
freopen(TASK".out","w",stdout);
}
int nTest = 1;
while (nTest --){
SOLVE();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDNlNSArIDU7CmNvbnN0IGxvbmcgbG9uZyBvbyA9IDFlMTg7CgppbnQgbiwgbSwgcywgdDsKCnN0cnVjdCBEQVRBewogICAgaW50IHYsIGYsIGlkOwp9OwoKdmVjdG9yIDwgREFUQSA+IEVbTl07Cgpib29sIGNtcChEQVRBIEEsIERBVEEgQil7CiAgICByZXR1cm4gQS5mIDwgQi5mOwp9CgpzdHJ1Y3QgR3JhcGh7CiAgICBpbnQgdSwgdiwgdywgZjsKfSBhW05dOwoKc3RydWN0IGRpbmh7CiAgICBpbnQgdSwgdHA7Cn07Cgp2ZWN0b3IgPCBwYWlyPGRpbmgsIGxvbmcgbG9uZz4gPiBHW05dWzJdOwoKc3RydWN0IGttdnsKICAgIGxvbmcgbG9uZyBkdTsKICAgIGludCB1LCB0cDsKCiAgICBib29sIG9wZXJhdG9yID4gKGttdiBBKXsKICAgICAgICByZXR1cm4gZHUgPiBBLmR1OwogICAgfQp9OwoKbG9uZyBsb25nIGRbTl1bMl07Cgp2b2lkIGRpamtzdHJhKCl7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpICsrKQogICAgICAgIGRbaV1bMF0gPSBkW2ldWzFdID0gb287CgogICAgcHJpb3JpdHlfcXVldWUgPGttdiwgdmVjdG9yPGttdj4sIGdyZWF0ZXI8PiA+IHBxOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkgKyspewogICAgICAgIGlmIChhW2ldLnUgPT0gcyl7CiAgICAgICAgICAgIGRbaV1bMF0gPSAwOwogICAgICAgICAgICBwcS5wdXNoKHswLCBpLCAwfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICBpZiAoYVtpXS52ID09IHMpewogICAgICAgICAgICBkW2ldWzFdID0gMDsKICAgICAgICAgICAgcHEucHVzaCh7MCwgaSwgMX0pOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAocHEuc2l6ZSgpKXsKICAgICAgICBrbXYgdmFsID0gcHEudG9wKCk7CiAgICAgICAgcHEucG9wKCk7CgogICAgICAgIGxvbmcgbG9uZyBkdSA9IHZhbC5kdTsKICAgICAgICBpbnQgdSA9IHZhbC51OwogICAgICAgIGludCB0cCA9IHZhbC50cDsKCiAgICAgICAgaWYgKGR1ICE9IGRbdV1bdHBdKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZm9yIChwYWlyPGRpbmgsIGxvbmcgbG9uZz4gaSA6IEdbdV1bdHBdKXsKICAgICAgICAgICAgaW50IHYgPSBpLmZpcnN0LnU7CiAgICAgICAgICAgIGludCBudHAgPSBpLmZpcnN0LnRwOwogICAgICAgICAgICBsb25nIGxvbmcgdyA9IGkuc2Vjb25kOwoKICAgICAgICAgICAgbG9uZyBsb25nIGR2ID0gZHUgKyB3OwoKICAgICAgICAgICAgaWYgKGRbdl1bbnRwXSA+IGR2KXsKICAgICAgICAgICAgICAgIGRbdl1bbnRwXSA9IGR2OwogICAgICAgICAgICAgICAgcHEucHVzaCh7ZHYsIHYsIG50cH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIFNPTFZFKCl7CiAgICBjaW4gPj4gbiA+PiBtID4+IHMgPj4gdDsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpICsrKXsKICAgICAgICBpbnQgdSwgdiwgdywgZjsKICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHcgPj4gZjsKCiAgICAgICAgaWYgKHUgPiB2KQogICAgICAgICAgICBzd2FwKHUsIHYpOwoKICAgICAgICBhW2ldID0ge3UsIHYsIHcsIGZ9OwoKICAgICAgICBFW3VdLnB1c2hfYmFjayh7diwgZiwgaX0pOwogICAgICAgIEVbdl0ucHVzaF9iYWNrKHt1LCBmLCBpfSk7CgogICAgICAgIEdbaV1bMF0ucHVzaF9iYWNrKHt7aSwgMX0sIHd9KTsKICAgICAgICBHW2ldWzFdLnB1c2hfYmFjayh7e2ksIDB9LCB3fSk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSArKyl7CiAgICAgICAgc29ydChFW2ldLmJlZ2luKCksIEVbaV0uZW5kKCksIGNtcCk7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBqICsgMSA8IChpbnQpIEVbaV0uc2l6ZSgpOyBqICsrKXsKICAgICAgICAgICAgaW50IGlkMSA9IEVbaV1bal0uaWQ7CiAgICAgICAgICAgIGludCB0cDEgPSAtMTsKCiAgICAgICAgICAgIGlmIChhW2lkMV0udSA9PSBpKQogICAgICAgICAgICAgICAgdHAxID0gMDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdHAxID0gMTsKCiAgICAgICAgICAgIGludCBpZDIgPSBFW2ldW2ogKyAxXS5pZDsKICAgICAgICAgICAgaW50IHRwMiA9IC0xOwoKICAgICAgICAgICAgaWYgKGFbaWQyXS51ID09IGkpCiAgICAgICAgICAgICAgICB0cDIgPSAwOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0cDIgPSAxOwoKICAgICAgICAgICAgaW50IHcgPSBFW2ldW2ogKyAxXS5mIC0gRVtpXVtqXS5mOwoKICAgICAgICAgICAgR1tpZDFdW3RwMV0ucHVzaF9iYWNrKHt7aWQyLCB0cDJ9LCB3fSk7CiAgICAgICAgICAgIEdbaWQyXVt0cDJdLnB1c2hfYmFjayh7e2lkMSwgdHAxfSwgd30pOwogICAgICAgIH0KICAgIH0KCiAgICBkaWprc3RyYSgpOwoKICAgIGxvbmcgbG9uZyBhbnMgPSBvbzsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpICsrKQogICAgICAgIGlmIChhW2ldLnUgPT0gdCkKICAgICAgICAgICAgYW5zID0gbWluKGFucywgZFtpXVswXSk7CiAgICAgICAgZWxzZQogICAgICAgIGlmIChhW2ldLnYgPT0gdCkKICAgICAgICAgICAgYW5zID0gbWluKGFucywgZFtpXVsxXSk7CgogICAgaWYgKGFucyA9PSBvbykKICAgICAgICBhbnMgPSAtMTsKCiAgICBjb3V0IDw8IGFuczsKfQoKc2lnbmVkIG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCiAgICAjZGVmaW5lIFRBU0sgIm1lc3NhZ2UiCgogICAgaWYgKGZvcGVuKFRBU0siLmlucCIsInIiKSl7CiAgICAgICAgZnJlb3BlbihUQVNLIi5pbnAiLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3BlbihUQVNLIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQoKICAgIGludCBuVGVzdCA9IDE7CgogICAgd2hpbGUgKG5UZXN0IC0tKXsKICAgICAgICBTT0xWRSgpOwogICAgfQoKICAgIHJldHVybiAwOwp9