#include<bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#define int long long
#define maxn 1000005
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define fi first
#define se second
#define ll long long
#define sti string
using namespace std;
struct node {
int u,v,sz_u;
};
struct DSU {
int n;
vector<int> par,sz;
vector<node> history;
DSU(int _n=0){
n=_n;
sz.assign(n+5,1);
par.assign(n+5,0);
for(int i=1;i<=n;i++) par[i]=i;
}
int find_par(int u){
while(u != par[u]){
u=par[u];
}
return u;
}
void join(int u,int v){
u=find_par(u);
v=find_par(v);
if(u==v){
history.push_back({-1,-1,0});
return ;
}
if(sz[u] < sz[v]) swap(u,v);
history.push_back({u,v,sz[u]});
sz[u]+=sz[v];
par[v]=u;
}
void rollback(int Time){
while(history.size() > Time){
auto [u,v,sz_u]=history.back();
history.pop_back();
if(v==-1) continue;
sz[u] = sz_u;
par[v]=v;
}
}
};
DSU dsu;
int s,t;
struct Edge {
int u,v,w;
bool operator < (const Edge &other) const {
return w < (other.w);
}
};
vector<Edge> A,B;
int n,m,q,res=4e18;
void dnc(int LeftA,int RightA,int LeftB,int RightB){
if(LeftA > RightA) return ;
int first = dsu.history.size();
int mid=(LeftA + RightA) /2;
for(int i = LeftA; i<=mid;i++){
dsu.join(A[i].u,A[i].v);
}
int pos = -1;
for(int j=LeftB;j<=RightB;j++){
if(dsu.find_par(s) == dsu.find_par(t)){
pos = j;
int costA = (mid >= 0 ) ? A[mid].w : 0;
int costB = (j>0) ? B[j-1].w : 0;
res = min(res, costA + costB);
break;
}
dsu.join(B[j].u,B[j].v);
}
if(pos == -1 && dsu.find_par(s) == dsu.find_par(t)){
pos = RightB + 1;
int costA = (mid >= 0 ) ? A[mid].w : 0;
int costB = (RightB>0) ? B[RightB].w : 0;
res = min(res, costA + costB);
}
dsu.rollback(first);
if(pos == -1){
for(int j=LeftA;j<=RightA;j++) dsu.join(A[j].u,A[j].v);
dnc(mid+1,RightA,LeftB,RightB);
dsu.rollback(first);
return ;
}
for(int j= LeftB;j < pos ; j++){
dsu.join(B[j].u,B[j].v);
}
dnc(LeftA,mid-1,pos,RightB);
dsu.rollback(first);
for(int j=LeftA;j<=mid;j++) dsu.join(A[j].u,A[j].v);
dnc(mid+1,RightA,LeftB,pos);
dsu.rollback(first);
}
signed main() {
itachi
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int opt; cin>>opt;
int u,v,w;
cin>>u>>v>>w;
if(opt==1){
A.push_back({u,v,w});
}
else B.push_back({u,v,w});
}
sort(A.begin(),A.end());
sort(B.begin(),B.end());
dnc(0,(int)A.size()-1,0,(int)B.size()-1);
cout<<res;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zLHVucm9sbC1sb29wcyIpCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIG1heG4gMTAwMDAwNQojZGVmaW5lIGl0YWNoaSBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBzdGkgc3RyaW5nCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IG5vZGUgewogICBpbnQgdSx2LHN6X3U7Cn07CgoKCnN0cnVjdCBEU1UgewogICBpbnQgbjsKICAgdmVjdG9yPGludD4gcGFyLHN6OwogICB2ZWN0b3I8bm9kZT4gaGlzdG9yeTsKICAgRFNVKGludCBfbj0wKXsKICAgICAgbj1fbjsKICAgICAgc3ouYXNzaWduKG4rNSwxKTsKICAgICAgcGFyLmFzc2lnbihuKzUsMCk7CiAgICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSBwYXJbaV09aTsKICAgfQogICBpbnQgZmluZF9wYXIoaW50IHUpewogICAgIHdoaWxlKHUgIT0gcGFyW3VdKXsKICAgICAgICB1PXBhclt1XTsKICAgICB9CiAgICAgcmV0dXJuIHU7CiAgIH0KICAgdm9pZCBqb2luKGludCB1LGludCB2KXsKICAgICB1PWZpbmRfcGFyKHUpOwogICAgIHY9ZmluZF9wYXIodik7CiAgICAgaWYodT09dil7CiAgICAgICAgIGhpc3RvcnkucHVzaF9iYWNrKHstMSwtMSwwfSk7CiAgICAgICAgIHJldHVybiA7CiAgICAgfQogICAgIGlmKHN6W3VdIDwgc3pbdl0pIHN3YXAodSx2KTsKICAgICBoaXN0b3J5LnB1c2hfYmFjayh7dSx2LHN6W3VdfSk7CiAgICAgc3pbdV0rPXN6W3ZdOwogICAgIHBhclt2XT11OwogICB9CiAgIHZvaWQgcm9sbGJhY2soaW50IFRpbWUpewogICAgICB3aGlsZShoaXN0b3J5LnNpemUoKSA+IFRpbWUpewogICAgICAgIGF1dG8gW3Usdixzel91XT1oaXN0b3J5LmJhY2soKTsKICAgICAgICBoaXN0b3J5LnBvcF9iYWNrKCk7CiAgICAgICAgaWYodj09LTEpIGNvbnRpbnVlOwogICAgICAgIHN6W3VdID0gc3pfdTsKICAgICAgICBwYXJbdl09djsKICAgICAgfQogICB9Cn07CgpEU1UgZHN1OwppbnQgcyx0OwoKc3RydWN0IEVkZ2UgewogICBpbnQgdSx2LHc7CiAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgRWRnZSAmb3RoZXIpIGNvbnN0IHsKICAgICByZXR1cm4gdyA8IChvdGhlci53KTsKICAgfQp9OwoKdmVjdG9yPEVkZ2U+IEEsQjsKaW50IG4sbSxxLHJlcz00ZTE4OwoKCnZvaWQgZG5jKGludCBMZWZ0QSxpbnQgUmlnaHRBLGludCBMZWZ0QixpbnQgUmlnaHRCKXsKICAgaWYoTGVmdEEgID4gUmlnaHRBKSByZXR1cm4gOwogICBpbnQgZmlyc3QgPSBkc3UuaGlzdG9yeS5zaXplKCk7CiAgIGludCBtaWQ9KExlZnRBICsgUmlnaHRBKSAvMjsKICAgZm9yKGludCBpID0gTGVmdEE7IGk8PW1pZDtpKyspewogICAgIGRzdS5qb2luKEFbaV0udSxBW2ldLnYpOwogICB9CiAgIGludCBwb3MgPSAtMTsKICAgZm9yKGludCBqPUxlZnRCO2o8PVJpZ2h0QjtqKyspewogICAgaWYoZHN1LmZpbmRfcGFyKHMpID09IGRzdS5maW5kX3Bhcih0KSl7CiAgICAgICAgcG9zID0gajsKICAgICAgICBpbnQgY29zdEEgPSAobWlkID49IDAgKSA/IEFbbWlkXS53IDogMDsKICAgICAgICBpbnQgY29zdEIgPSAoaj4wKSA/IEJbai0xXS53IDogMDsKICAgICAgICByZXMgPSBtaW4ocmVzLCBjb3N0QSArIGNvc3RCKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGRzdS5qb2luKEJbal0udSxCW2pdLnYpOwogICB9CiAgIGlmKHBvcyA9PSAtMSAmJiBkc3UuZmluZF9wYXIocykgPT0gZHN1LmZpbmRfcGFyKHQpKXsKICAgICAgIHBvcyA9IFJpZ2h0QiArIDE7CiAgICAgICBpbnQgY29zdEEgPSAobWlkID49IDAgKSA/IEFbbWlkXS53IDogMDsKICAgICAgICBpbnQgY29zdEIgPSAoUmlnaHRCPjApID8gQltSaWdodEJdLncgOiAwOwogICAgICAgIHJlcyA9IG1pbihyZXMsIGNvc3RBICsgY29zdEIpOwogICB9CiAgIGRzdS5yb2xsYmFjayhmaXJzdCk7CgogICBpZihwb3MgPT0gLTEpewogICAgICBmb3IoaW50IGo9TGVmdEE7ajw9UmlnaHRBO2orKykgZHN1LmpvaW4oQVtqXS51LEFbal0udik7CiAgICAgIGRuYyhtaWQrMSxSaWdodEEsTGVmdEIsUmlnaHRCKTsKICAgICAgZHN1LnJvbGxiYWNrKGZpcnN0KTsKICAgICAgcmV0dXJuIDsKICAgfQoKICAgZm9yKGludCBqPSBMZWZ0QjtqIDwgcG9zIDsgaisrKXsKICAgICBkc3Uuam9pbihCW2pdLnUsQltqXS52KTsKICAgfQogICBkbmMoTGVmdEEsbWlkLTEscG9zLFJpZ2h0Qik7CiAgIGRzdS5yb2xsYmFjayhmaXJzdCk7CgogICBmb3IoaW50IGo9TGVmdEE7ajw9bWlkO2orKykgZHN1LmpvaW4oQVtqXS51LEFbal0udik7CiAgIGRuYyhtaWQrMSxSaWdodEEsTGVmdEIscG9zKTsKICAgZHN1LnJvbGxiYWNrKGZpcnN0KTsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpdGFjaGkKICAgIGNpbj4+bj4+bT4+cz4+dDsKICAgIGZvcihpbnQgaT0xO2k8PW07aSsrKXsKICAgICAgICBpbnQgb3B0OyBjaW4+Pm9wdDsKICAgICAgICBpbnQgdSx2LHc7CiAgICAgICAgY2luPj51Pj52Pj53OwogICAgICAgIGlmKG9wdD09MSl7CiAgICAgICAgICAgIEEucHVzaF9iYWNrKHt1LHYsd30pOwogICAgICAgIH0KICAgICAgICBlbHNlIEIucHVzaF9iYWNrKHt1LHYsd30pOwogICAgfQogICAgc29ydChBLmJlZ2luKCksQS5lbmQoKSk7CiAgICBzb3J0KEIuYmVnaW4oKSxCLmVuZCgpKTsKICAgIGRuYygwLChpbnQpQS5zaXplKCktMSwwLChpbnQpQi5zaXplKCktMSk7CiAgICBjb3V0PDxyZXM7CiAgICByZXR1cm4gMDsKfQo=