#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define M 1000000007
#define MAXN 1000001
#define INF (1ll<<60)
#define NAME "file"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
ll n, m, q, m_1, m_2, s, t, ans = INF ;
ll a[MAXN] ;
ll lab[MAXN ] ;
struct Edge {
ll u, v, w ;
bool operator < (const Edge & other ) const {
return w < other.w ;
}
};
Edge A[MAXN], B[MAXN ] ;
struct Data {
ll u, v, sz_u, sz_v ;
};
stack<Data> history ;
ll find_set(ll a ) {
return lab[a] < 0 ? a : find_set(lab[a]) ;
}
ll same_set(ll a, ll b ) {
return find_set(a) == find_set(b) ;
}
bool union_set(ll a, ll b ) {
a = find_set(a) ;
b = find_set(b) ;
if(a == b ) return false ;
if(lab[a] > lab[b]) swap(a, b ) ;
history.push({a, b, lab[a], lab[b] }) ;
lab[a] += lab[b] ;
lab[b] = a;
return true ;
}
ll snapshot() {
return history.size() ;
}
void rollBack(ll time ) {
while(history.size() > time ) {
Data u = history.top() ;
lab[u.u] = u.sz_u ;
lab[u.v] = u.sz_v ;
history.pop() ;
}
}
void dnc(ll l1, ll r1, ll l2, ll r2 ) {
if(l1 > r1 || l2 > r2 ) return ;
ll snap = snapshot() ;
ll mid = l1 + r1 >> 1 ;
FOR(i, l1, mid ) union_set(A[i].u, A[i].v ) ;
ll fmid = -1 ;
FOR(i, l2, r2 ) {
union_set(B[i].u, B[i].v ) ;
if(same_set(s, t )) {
fmid = i ;
break ;
}
}
if(fmid != -1 ) {
ans = min(ans, B[fmid].w + A[mid].w ) ;
}
rollBack(snap ) ;
if(l1 == r1 ) return ;
FOR(i, l1, mid ) union_set(A[i].u, A[i].v ) ;
if(fmid == -1 ) {
dnc(mid + 1, r1, l2, r2 ) ;
} else {
dnc(mid + 1, r1, l2, fmid ) ;
}
rollBack(snap ) ;
if(fmid != -1 ) {
FOR(i, l2, fmid - 1 ) union_set(B[i].u, B[i].v ) ;
dnc(l1, mid, fmid, r2 ) ;
rollBack(snap ) ;
}
}
void init() {
cin >> n >> m >> s >> t ;
FOR(i, 1, m ) {
ll t, u, v, w ;
cin >> t >> u >> v >> w ;
if(t == 1 ) {
m_1 ++ ;
A[m_1] = {u, v, w } ;
} else {
m_2 ++ ;
B[m_2] = {u, v, w } ;
}
}
sort(A + 1, A + m_1 + 1 ) ;
sort(B + 1, B + m_2 + 1 ) ;
}
void solve() {
memset(lab, -1, sizeof lab ) ;
FOR(i, 1, m_2 ) {
union_set(B[i].u, B[i].v ) ;
if(same_set(s, t )) {
ans = min(B[i].w , ans ) ;
break ;
}
}
rollBack(0) ;
FOR(i, 1, m_1 ) {
union_set(A[i].u, A[i].v ) ;
if(same_set(s, t )) {
ans = min(A[i].w , ans ) ;
break ;
}
}
rollBack(0) ;
dnc(1, m_1, 1, m_2 ) ;
cout << ans << el ;
}
_ROOT_ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1; // cin >> t ;
while(t--) {
init();
solve();
}
return (0&0);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGNvbXBhcmUodikgc29ydCgodikuYmVnaW4oKSwgKHYpLmVuZCgpKTsgKHYpLmVyYXNlKHVuaXF1ZSgodikuYmVnaW4oKSwgKHYpLmVuZCgpKSwgKHYpLmVuZCgpKTsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBfUk9PVF8gaW50IG1haW4oKQojZGVmaW5lIE0gMTAwMDAwMDAwNwojZGVmaW5lIE1BWE4gMTAwMDAwMQojZGVmaW5lIElORiAoMWxsPDw2MCkKI2RlZmluZSBOQU1FICJmaWxlIgojZGVmaW5lIGRlYnVnKGEpIGNvdXQgPDwgI2EgPDwgIiA9ICIgPDwgYSA8PCBlbmRsOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKbGwgbiwgbSwgcSwgbV8xLCBtXzIsIHMsIHQsIGFucyA9IElORiA7CmxsIGFbTUFYTl0gOwpsbCBsYWJbTUFYTiBdIDsKCnN0cnVjdCBFZGdlIHsKICAgIGxsIHUsIHYsIHcgOwogICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBFZGdlICYgb3RoZXIgKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHcgPCBvdGhlci53IDsKICAgIH0KfTsKRWRnZSBBW01BWE5dLCBCW01BWE4gXSA7CgpzdHJ1Y3QgRGF0YSB7CiAgICBsbCB1LCB2LCBzel91LCBzel92IDsKfTsKc3RhY2s8RGF0YT4gaGlzdG9yeSA7CgpsbCBmaW5kX3NldChsbCBhICkgewogICAgcmV0dXJuIGxhYlthXSA8IDAgPyBhIDogZmluZF9zZXQobGFiW2FdKSA7Cn0KbGwgc2FtZV9zZXQobGwgYSwgbGwgYiApIHsKICAgIHJldHVybiBmaW5kX3NldChhKSA9PSBmaW5kX3NldChiKSA7Cn0KYm9vbCB1bmlvbl9zZXQobGwgYSwgbGwgYiApIHsKICAgIGEgPSBmaW5kX3NldChhKSA7CiAgICBiID0gZmluZF9zZXQoYikgOwogICAgaWYoYSA9PSBiICkgcmV0dXJuIGZhbHNlIDsKICAgIGlmKGxhYlthXSA+IGxhYltiXSkgc3dhcChhLCBiICkgOwogICAgaGlzdG9yeS5wdXNoKHthLCBiLCBsYWJbYV0sIGxhYltiXSB9KSA7CiAgICBsYWJbYV0gKz0gbGFiW2JdIDsKICAgIGxhYltiXSA9IGE7CiAgICByZXR1cm4gdHJ1ZSA7Cn0KCmxsIHNuYXBzaG90KCkgewogICAgcmV0dXJuIGhpc3Rvcnkuc2l6ZSgpIDsKfQoKdm9pZCByb2xsQmFjayhsbCB0aW1lICkgewogICAgd2hpbGUoaGlzdG9yeS5zaXplKCkgPiB0aW1lICkgewogICAgICAgIERhdGEgdSA9IGhpc3RvcnkudG9wKCkgOwogICAgICAgIGxhYlt1LnVdID0gdS5zel91IDsKICAgICAgICBsYWJbdS52XSA9IHUuc3pfdiA7CiAgICAgICAgaGlzdG9yeS5wb3AoKSA7CiAgICB9Cn0KCnZvaWQgZG5jKGxsIGwxLCBsbCByMSwgbGwgbDIsIGxsIHIyICkgewogICAgaWYobDEgPiByMSB8fCBsMiA+IHIyICkgcmV0dXJuIDsKICAgIGxsIHNuYXAgPSBzbmFwc2hvdCgpIDsKICAgIGxsIG1pZCA9IGwxICsgcjEgPj4gMSA7CiAgICBGT1IoaSwgbDEsIG1pZCApIHVuaW9uX3NldChBW2ldLnUsIEFbaV0udiApIDsKICAgIGxsIGZtaWQgPSAtMSA7CiAgICBGT1IoaSwgbDIsIHIyICkgewogICAgICAgIHVuaW9uX3NldChCW2ldLnUsIEJbaV0udiApIDsKICAgICAgICBpZihzYW1lX3NldChzLCB0ICkpIHsKICAgICAgICAgICAgZm1pZCA9IGkgOwogICAgICAgICAgICBicmVhayA7CiAgICAgICAgfQogICAgfQoKICAgIGlmKGZtaWQgIT0gLTEgKSB7CiAgICAgICAgYW5zID0gbWluKGFucywgQltmbWlkXS53ICsgQVttaWRdLncgKSA7CiAgICB9CiAgICByb2xsQmFjayhzbmFwICkgOwogICAgaWYobDEgPT0gcjEgKSByZXR1cm4gOwoKICAgIEZPUihpLCBsMSwgbWlkICkgdW5pb25fc2V0KEFbaV0udSwgQVtpXS52ICkgOwoKICAgIGlmKGZtaWQgPT0gLTEgKSB7CiAgICAgICAgZG5jKG1pZCArIDEsIHIxLCBsMiwgcjIgKSA7CiAgICB9IGVsc2UgewogICAgICAgIGRuYyhtaWQgKyAxLCByMSwgbDIsIGZtaWQgKSA7CiAgICB9CiAgICByb2xsQmFjayhzbmFwICkgOwoKICAgIGlmKGZtaWQgIT0gLTEgKSB7CiAgICAgICAgRk9SKGksIGwyLCBmbWlkIC0gMSApIHVuaW9uX3NldChCW2ldLnUsIEJbaV0udiApIDsKICAgICAgICBkbmMobDEsIG1pZCwgZm1pZCwgcjIgKSA7CiAgICAgICAgcm9sbEJhY2soc25hcCApIDsKICAgIH0KfQoKdm9pZCBpbml0KCkgewogICAgY2luID4+IG4gPj4gbSA+PiBzID4+IHQgOwogICAgRk9SKGksIDEsIG0gKSB7CiAgICAgICAgbGwgdCwgdSwgdiwgdyA7CiAgICAgICAgY2luID4+IHQgPj4gdSA+PiB2ID4+IHcgOwogICAgICAgIGlmKHQgPT0gMSApIHsKICAgICAgICAgICAgbV8xICsrIDsKICAgICAgICAgICAgQVttXzFdID0ge3UsIHYsIHcgfSA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbV8yICsrIDsKICAgICAgICAgICAgQlttXzJdID0ge3UsIHYsIHcgfSA7CiAgICAgICAgfQogICAgfQogICAgc29ydChBICsgMSwgQSArIG1fMSArIDEgKSA7CiAgICBzb3J0KEIgKyAxLCBCICsgbV8yICsgMSApIDsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIG1lbXNldChsYWIsIC0xLCBzaXplb2YgbGFiICkgOwoKICAgIEZPUihpLCAxLCBtXzIgKSB7CiAgICAgICAgdW5pb25fc2V0KEJbaV0udSwgQltpXS52ICkgOwogICAgICAgIGlmKHNhbWVfc2V0KHMsIHQgKSkgewogICAgICAgICAgICBhbnMgPSBtaW4oQltpXS53ICwgYW5zICkgOwogICAgICAgICAgICBicmVhayA7CiAgICAgICAgfQogICAgfQogICAgcm9sbEJhY2soMCkgOwogICAgRk9SKGksIDEsIG1fMSApIHsKICAgICAgICB1bmlvbl9zZXQoQVtpXS51LCBBW2ldLnYgKSA7CiAgICAgICAgaWYoc2FtZV9zZXQocywgdCApKSB7CiAgICAgICAgICAgIGFucyA9IG1pbihBW2ldLncgLCBhbnMgKSA7CiAgICAgICAgICAgIGJyZWFrIDsKICAgICAgICB9CiAgICB9CiAgICByb2xsQmFjaygwKSA7CiAgICBkbmMoMSwgbV8xLCAxLCBtXzIgKSA7CiAgICBjb3V0IDw8IGFucyA8PCBlbCA7Cn0KCl9ST09UXyB7CiAgICAvLyBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7CiAgICAvLyBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CiAgICBjb3V0LnRpZSgwKTsKICAgIGludCB0ID0gMTsgLy8gY2luID4+IHQgOwogICAgd2hpbGUodC0tKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gKDAmMCk7Cn0K