#include <bits/stdc++.h>
#define SPED \
ios_base::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define endl "\n"
#define fi first
#define se second
#define lint long long
#define fami signed
#define lore main
#define freefire freopen
#define Data tuple<int, int, int, lint>
const lint INF = 0x1f1f1f1f1f1f1f1f;
const lint NEG = 0xE1E1E1E1E1E1E1E1;
using namespace std;
int n, m, s, t;
vector<tuple<int, lint, int, int>> adj[50005];
Data edge[50005];
bool checksub1 = true;
bool vis[50005];
lint bef[50005];
int par[50005], sz[50005];
void setup()
{
iota(par + 1, par + 1 + n, 1);
fill(sz + 1, sz + 1 + n, 1);
}
int find_par(int now)
{
return par[now] == now ? now : par[now] = find_par(par[now]);
}
void combine(int l, int r)
{
l = find_par(l);
r = find_par(r);
if (l == r)
return;
if (sz[l] < sz[r])
swap(l, r);
par[r] = l;
sz[l] += sz[r];
}
bool check1(lint mid)
{
fill(vis, vis + 1 + n, false);
queue<int> temp;
vis[s] = true;
temp.emplace(s);
while (!temp.empty())
{
auto now = temp.front();
temp.pop();
if (now == t)
return true;
for (auto [v, w, mode, idx] : adj[now])
{
if (w <= mid and !vis[v])
{
vis[v] = true;
temp.emplace(v);
}
}
}
return vis[t];
}
lint binaryu1()
{
lint l = 0, r = 1e9, mid, ans = -1;
while (l <= r)
{
mid = l + r >> 1;
if (check1(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
return ans;
}
void sub1()
{
cout << binaryu1() << endl;
}
bool legit[50005];
bool check2(lint mid)
{
fill(vis, vis + 1 + n, false);
queue<int> q;
vis[s] = true;
q.emplace(s);
while (!q.empty())
{
int u = q.front();
q.pop();
if (u == t)
return true;
for (auto [v, w, mode, idx] : adj[u])
{
if (mode == 1)
{
if (legit[idx] && !vis[v])
{
vis[v] = true;
q.emplace(v);
}
}
else
{
if (w <= bef[mid] and !vis[v])
{
vis[v] = true;
q.emplace(v);
}
}
}
}
return vis[t];
}
lint binaryu2(int mx)
{
lint l = 1, r = mx, mid, ans = -1;
while (l <= r)
{
mid = l + r >> 1;
if (check2(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
return ans;
}
vector<int> e1[50005], e2[50005];
void sub2()
{
vector<lint> zip;
for (int i = 1; i <= m; i++)
zip.emplace_back(get<3>(edge[i]));
sort(zip.begin(), zip.end());
zip.erase(unique(zip.begin(), zip.end()), zip.end());
for (int i = 1; i <= m; i++)
{
auto [mode, l, r, w] = edge[i];
auto idx = lower_bound(zip.begin(), zip.end(), w) - zip.begin() + 1;
bef[idx] = w;
// cout << w << " : " << idx << endl;
if (mode == 1)
e1[idx].emplace_back(i);
else
e2[idx].emplace_back(i);
}
int mxb = 0, stata = 0;
setup();
for (int i = 1; i <= zip.size(); i++)
{
mxb = i;
for (auto z : e2[i])
{
auto [mode, l, r, w] = edge[z];
combine(l, r);
}
if (find_par(s) == find_par(t))
break;
}
for (int i = 1; i <= zip.size(); i++)
{
if (find_par(s) == find_par(t))
break;
stata = i;
for (auto z : e1[i])
{
auto [mode, l, r, w] = edge[z];
combine(l, r);
}
}
lint res = INF;
for (int j = 1; j <= stata; j++)
for (auto z : e1[j])
{
auto [mode, l, r, w] = edge[z];
// combine(l, r);
legit[z] = true;
}
int nwmxb = binaryu2(mxb);
if (nwmxb != -1)
res = min(res, bef[nwmxb] + bef[stata]);
for (int i = stata + 1; i <= zip.size(); i++)
{
for (auto z : e1[i])
{
legit[z] = true;
auto [mode, l, r, w] = edge[z];
// combine(l, r);
}
nwmxb = binaryu2(mxb);
mxb = nwmxb;
res = min(res, bef[i] + bef[nwmxb]);
}
cout << res << endl;
}
fami lore()
{
SPED;
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i++)
{
int mode, l, r;
lint w;
cin >> mode >> l >> r >> w;
adj[l].emplace_back(r, w, mode, i);
adj[r].emplace_back(l, w, mode, i);
edge[i] = {mode, l, r, w};
if (mode == 2)
checksub1 = false;
}
if (checksub1 == true)
{
sub1();
return 0;
}
else if (n <= 5000 and m <= 5000)
{
sub2();
return 0;
}
// else
// {
// sub3();
// return 0;
// }
}
// Let your soul wander where dreams are born.
/*
test sub1 :
5 5 1 5
1 1 2 2
1 2 3 4
1 3 4 3
1 2 4 5
1 4 5 2
test sub2 :
6 7 1 4
1 1 2 4
2 2 3 7
1 3 4 6
2 1 6 5
1 6 5 5
2 5 4 8
2 2 5 2
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIFNQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBjaW4udGllKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgY291dC50aWUoMCk7CgojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgbGludCBsb25nIGxvbmcKI2RlZmluZSBmYW1pIHNpZ25lZAojZGVmaW5lIGxvcmUgbWFpbgojZGVmaW5lIGZyZWVmaXJlIGZyZW9wZW4KI2RlZmluZSBEYXRhIHR1cGxlPGludCwgaW50LCBpbnQsIGxpbnQ+Cgpjb25zdCBsaW50IElORiA9IDB4MWYxZjFmMWYxZjFmMWYxZjsKY29uc3QgbGludCBORUcgPSAweEUxRTFFMUUxRTFFMUUxRTE7Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG4sIG0sIHMsIHQ7CnZlY3Rvcjx0dXBsZTxpbnQsIGxpbnQsIGludCwgaW50Pj4gYWRqWzUwMDA1XTsKRGF0YSBlZGdlWzUwMDA1XTsKYm9vbCBjaGVja3N1YjEgPSB0cnVlOwpib29sIHZpc1s1MDAwNV07CmxpbnQgYmVmWzUwMDA1XTsKCmludCBwYXJbNTAwMDVdLCBzels1MDAwNV07Cgp2b2lkIHNldHVwKCkKewogICAgaW90YShwYXIgKyAxLCBwYXIgKyAxICsgbiwgMSk7CiAgICBmaWxsKHN6ICsgMSwgc3ogKyAxICsgbiwgMSk7Cn0KCmludCBmaW5kX3BhcihpbnQgbm93KQp7CiAgICByZXR1cm4gcGFyW25vd10gPT0gbm93ID8gbm93IDogcGFyW25vd10gPSBmaW5kX3BhcihwYXJbbm93XSk7Cn0KCnZvaWQgY29tYmluZShpbnQgbCwgaW50IHIpCnsKICAgIGwgPSBmaW5kX3BhcihsKTsKICAgIHIgPSBmaW5kX3BhcihyKTsKCiAgICBpZiAobCA9PSByKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoc3pbbF0gPCBzeltyXSkKICAgICAgICBzd2FwKGwsIHIpOwoKICAgIHBhcltyXSA9IGw7CiAgICBzeltsXSArPSBzeltyXTsKfQoKYm9vbCBjaGVjazEobGludCBtaWQpCnsKICAgIGZpbGwodmlzLCB2aXMgKyAxICsgbiwgZmFsc2UpOwogICAgcXVldWU8aW50PiB0ZW1wOwogICAgdmlzW3NdID0gdHJ1ZTsKICAgIHRlbXAuZW1wbGFjZShzKTsKCiAgICB3aGlsZSAoIXRlbXAuZW1wdHkoKSkKICAgIHsKICAgICAgICBhdXRvIG5vdyA9IHRlbXAuZnJvbnQoKTsKICAgICAgICB0ZW1wLnBvcCgpOwogICAgICAgIGlmIChub3cgPT0gdCkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAgIGZvciAoYXV0byBbdiwgdywgbW9kZSwgaWR4XSA6IGFkaltub3ddKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHcgPD0gbWlkIGFuZCAhdmlzW3ZdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aXNbdl0gPSB0cnVlOwogICAgICAgICAgICAgICAgdGVtcC5lbXBsYWNlKHYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB2aXNbdF07Cn0KCmxpbnQgYmluYXJ5dTEoKQp7CiAgICBsaW50IGwgPSAwLCByID0gMWU5LCBtaWQsIGFucyA9IC0xOwoKICAgIHdoaWxlIChsIDw9IHIpCiAgICB7CiAgICAgICAgbWlkID0gbCArIHIgPj4gMTsKCiAgICAgICAgaWYgKGNoZWNrMShtaWQpKQogICAgICAgIHsKICAgICAgICAgICAgYW5zID0gbWlkOwogICAgICAgICAgICByID0gbWlkIC0gMTsKICAgICAgICB9CgogICAgICAgIGVsc2UKICAgICAgICAgICAgbCA9IG1pZCArIDE7CiAgICB9CgogICAgcmV0dXJuIGFuczsKfQoKdm9pZCBzdWIxKCkKewogICAgY291dCA8PCBiaW5hcnl1MSgpIDw8IGVuZGw7Cn0KCmJvb2wgbGVnaXRbNTAwMDVdOwoKYm9vbCBjaGVjazIobGludCBtaWQpCnsKICAgIGZpbGwodmlzLCB2aXMgKyAxICsgbiwgZmFsc2UpOwogICAgcXVldWU8aW50PiBxOwogICAgdmlzW3NdID0gdHJ1ZTsKICAgIHEuZW1wbGFjZShzKTsKCiAgICB3aGlsZSAoIXEuZW1wdHkoKSkKICAgIHsKICAgICAgICBpbnQgdSA9IHEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGlmICh1ID09IHQpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgICBmb3IgKGF1dG8gW3YsIHcsIG1vZGUsIGlkeF0gOiBhZGpbdV0pCiAgICAgICAgewogICAgICAgICAgICBpZiAobW9kZSA9PSAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGVnaXRbaWR4XSAmJiAhdmlzW3ZdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZpc1t2XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcS5lbXBsYWNlKHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHcgPD0gYmVmW21pZF0gYW5kICF2aXNbdl0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmlzW3ZdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBxLmVtcGxhY2Uodik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmlzW3RdOwp9CgpsaW50IGJpbmFyeXUyKGludCBteCkKewogICAgbGludCBsID0gMSwgciA9IG14LCBtaWQsIGFucyA9IC0xOwogICAgd2hpbGUgKGwgPD0gcikKICAgIHsKICAgICAgICBtaWQgPSBsICsgciA+PiAxOwogICAgICAgIGlmIChjaGVjazIobWlkKSkKICAgICAgICB7CiAgICAgICAgICAgIGFucyA9IG1pZDsKICAgICAgICAgICAgciA9IG1pZCAtIDE7CiAgICAgICAgfQoKICAgICAgICBlbHNlCiAgICAgICAgICAgIGwgPSBtaWQgKyAxOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKdmVjdG9yPGludD4gZTFbNTAwMDVdLCBlMls1MDAwNV07Cgp2b2lkIHN1YjIoKQp7CiAgICB2ZWN0b3I8bGludD4gemlwOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgICAgICB6aXAuZW1wbGFjZV9iYWNrKGdldDwzPihlZGdlW2ldKSk7CgogICAgc29ydCh6aXAuYmVnaW4oKSwgemlwLmVuZCgpKTsKICAgIHppcC5lcmFzZSh1bmlxdWUoemlwLmJlZ2luKCksIHppcC5lbmQoKSksIHppcC5lbmQoKSk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKQogICAgewogICAgICAgIGF1dG8gW21vZGUsIGwsIHIsIHddID0gZWRnZVtpXTsKICAgICAgICBhdXRvIGlkeCA9IGxvd2VyX2JvdW5kKHppcC5iZWdpbigpLCB6aXAuZW5kKCksIHcpIC0gemlwLmJlZ2luKCkgKyAxOwogICAgICAgIGJlZltpZHhdID0gdzsKCiAgICAgICAgLy8gY291dCA8PCB3IDw8ICIgOiAiIDw8IGlkeCA8PCBlbmRsOwoKICAgICAgICBpZiAobW9kZSA9PSAxKQogICAgICAgICAgICBlMVtpZHhdLmVtcGxhY2VfYmFjayhpKTsKCiAgICAgICAgZWxzZQogICAgICAgICAgICBlMltpZHhdLmVtcGxhY2VfYmFjayhpKTsKICAgIH0KCiAgICBpbnQgbXhiID0gMCwgc3RhdGEgPSAwOwoKICAgIHNldHVwKCk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSB6aXAuc2l6ZSgpOyBpKyspCiAgICB7CiAgICAgICAgbXhiID0gaTsKCiAgICAgICAgZm9yIChhdXRvIHogOiBlMltpXSkKICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gW21vZGUsIGwsIHIsIHddID0gZWRnZVt6XTsKICAgICAgICAgICAgY29tYmluZShsLCByKTsKICAgICAgICB9CgogICAgICAgIGlmIChmaW5kX3BhcihzKSA9PSBmaW5kX3Bhcih0KSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gemlwLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGlmIChmaW5kX3BhcihzKSA9PSBmaW5kX3Bhcih0KSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgc3RhdGEgPSBpOwoKICAgICAgICBmb3IgKGF1dG8geiA6IGUxW2ldKQogICAgICAgIHsKICAgICAgICAgICAgYXV0byBbbW9kZSwgbCwgciwgd10gPSBlZGdlW3pdOwogICAgICAgICAgICBjb21iaW5lKGwsIHIpOwogICAgICAgIH0KICAgIH0KCiAgICBsaW50IHJlcyA9IElORjsKICAgIGZvciAoaW50IGogPSAxOyBqIDw9IHN0YXRhOyBqKyspCiAgICAgICAgZm9yIChhdXRvIHogOiBlMVtqXSkKICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gW21vZGUsIGwsIHIsIHddID0gZWRnZVt6XTsKICAgICAgICAgICAgLy8gY29tYmluZShsLCByKTsKICAgICAgICAgICAgbGVnaXRbel0gPSB0cnVlOwogICAgICAgIH0KCiAgICBpbnQgbndteGIgPSBiaW5hcnl1MihteGIpOwoKICAgIGlmIChud214YiAhPSAtMSkKICAgICAgICByZXMgPSBtaW4ocmVzLCBiZWZbbndteGJdICsgYmVmW3N0YXRhXSk7CgogICAgZm9yIChpbnQgaSA9IHN0YXRhICsgMTsgaSA8PSB6aXAuc2l6ZSgpOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChhdXRvIHogOiBlMVtpXSkKICAgICAgICB7CiAgICAgICAgICAgIGxlZ2l0W3pdID0gdHJ1ZTsKICAgICAgICAgICAgYXV0byBbbW9kZSwgbCwgciwgd10gPSBlZGdlW3pdOwogICAgICAgICAgICAvLyBjb21iaW5lKGwsIHIpOwogICAgICAgIH0KICAgICAgICBud214YiA9IGJpbmFyeXUyKG14Yik7CiAgICAgICAgbXhiID0gbndteGI7CgogICAgICAgIHJlcyA9IG1pbihyZXMsIGJlZltpXSArIGJlZltud214Yl0pOwogICAgfQogICAgY291dCA8PCByZXMgPDwgZW5kbDsKfQoKZmFtaSBsb3JlKCkKewogICAgU1BFRDsKICAgIGNpbiA+PiBuID4+IG0gPj4gcyA+PiB0OwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgIHsKICAgICAgICBpbnQgbW9kZSwgbCwgcjsKICAgICAgICBsaW50IHc7CiAgICAgICAgY2luID4+IG1vZGUgPj4gbCA+PiByID4+IHc7CiAgICAgICAgYWRqW2xdLmVtcGxhY2VfYmFjayhyLCB3LCBtb2RlLCBpKTsKICAgICAgICBhZGpbcl0uZW1wbGFjZV9iYWNrKGwsIHcsIG1vZGUsIGkpOwogICAgICAgIGVkZ2VbaV0gPSB7bW9kZSwgbCwgciwgd307CgogICAgICAgIGlmIChtb2RlID09IDIpCiAgICAgICAgICAgIGNoZWNrc3ViMSA9IGZhbHNlOwogICAgfQoKICAgIGlmIChjaGVja3N1YjEgPT0gdHJ1ZSkKICAgIHsKICAgICAgICBzdWIxKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZWxzZSBpZiAobiA8PSA1MDAwIGFuZCBtIDw9IDUwMDApCiAgICB7CiAgICAgICAgc3ViMigpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIGVsc2UKICAgIC8vIHsKICAgIC8vICAgICBzdWIzKCk7CiAgICAvLyAgICAgcmV0dXJuIDA7CiAgICAvLyB9Cn0KLy8gTGV0IHlvdXIgc291bCB3YW5kZXIgd2hlcmUgZHJlYW1zIGFyZSBib3JuLgoKLyoKICAgIHRlc3Qgc3ViMSA6CgogICAgNSA1IDEgNQoKICAgIDEgMSAyIDIKICAgIDEgMiAzIDQKICAgIDEgMyA0IDMKICAgIDEgMiA0IDUKICAgIDEgNCA1IDIKCiAgICB0ZXN0IHN1YjIgOgogICAgNiA3IDEgNAoKICAgIDEgMSAyIDQKICAgIDIgMiAzIDcKICAgIDEgMyA0IDYKICAgIDIgMSA2IDUKICAgIDEgNiA1IDUKICAgIDIgNSA0IDgKICAgIDIgMiA1IDIKKi8K