#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
bool minimize(T& a, const T& b) {
if (b < a) {a = b; return true;}
return false;
}
const int N = 1e5 + 5;
int n, m;
int s, t, a, b;
vector<ii> adj[N];
struct Node {
int u; ll d;
bool operator<(const Node& other) const {
return d > other.d;
}
};
ll dist_s[N];
ll dist_t[N];
ll dist_a[N];
ll dist_b[N];
void dijkstra(int s, ll dist[]) {
for (int u = 1; u <= n; u++) dist[u] = LINF;
priority_queue<Node> pq;
dist[s] = 0;
pq.push({s, dist[s]});
while (!pq.empty()) {
Node front = pq.top(); pq.pop();
int u = front.u; ll d = front.d;
if (d > dist[u]) continue;
for (ii v : adj[u]) {
if (minimize(dist[v.first], dist[u] + v.second)) {
pq.push({v.first, dist[v.first]});
}
}
}
}
// Đáp án sẽ có dạng a -> x -> y -> b hoặc b -> x -> y -> a
// hay dist_a[x] + dist_b[y] hoặc dist_b[x] + dist_a[y]
// Với đường đi x -> y thuộc vào một đường đi ngắn nhất nào đấy đi từ s đến t
// hay x -> y là một đường đi trên đồ thị đường đi ngắn nhất của s, t
vector<int> g[N];
ll memo[N];
// dp_a(x) = min({dist_a(y)}) với mọi y sao cho tồn tại đường đi x -> y trên đồ thị đường đi ngắn nhất
ll dp_a(int x) {
ll& ans = memo[x];
if (ans != -1) return ans;
ans = dist_a[x];
for (int nxt_x : g[x]) {
minimize(ans, dp_a(nxt_x));
}
return ans;
}
// dp_b(x) = min({dist_b(y)}) với mọi y sao cho tồn tại đường đi x -> y trên đồ thị đường đi ngắn nhất
ll dp_b(int x) {
ll& ans = memo[x];
if (ans != -1) return ans;
ans = dist_b[x];
for (int nxt_x : g[x]) {
minimize(ans, dp_b(nxt_x));
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
cin >> s >> t;
cin >> a >> b;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
// Build đồ thị đường đi ngắn nhất với đỉnh xuất phát s, đỉnh kết thúc t
dijkstra(s, dist_s);
dijkstra(t, dist_t);
for (int u = 1; u <= n; u++) {
for (ii v : adj[u]) {
if (dist_s[u] + v.second + dist_t[v.first] == dist_s[t]) {
g[u].push_back(v.first);
}
}
}
dijkstra(a, dist_a);
dijkstra(b, dist_b);
// Trường hợp a -> x -> y -> b
memset(memo, -1, sizeof memo);
ll ans = dist_a[b];
for (int x = 1; x <= n; x++) {
minimize(ans, dist_a[x] + dp_b(x));
}
// Trường hợp b -> x -> y -> a
memset(memo, -1, sizeof memo);
for (int x = 1; x <= n; x++) {
minimize(ans, dist_b[x] + dp_a(x));
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KYm9vbCBtaW5pbWl6ZShUJiBhLCBjb25zdCBUJiBiKSB7CglpZiAoYiA8IGEpIHthID0gYjsgcmV0dXJuIHRydWU7fQoJcmV0dXJuIGZhbHNlOwp9Cgpjb25zdCBpbnQgTiA9IDFlNSArIDU7ICAKCmludCBuLCBtOyAKaW50IHMsIHQsIGEsIGI7ICAKdmVjdG9yPGlpPiBhZGpbTl07IAoKc3RydWN0IE5vZGUgewoJaW50IHU7IGxsIGQ7IAoJYm9vbCBvcGVyYXRvcjwoY29uc3QgTm9kZSYgb3RoZXIpIGNvbnN0IHsKCQlyZXR1cm4gZCA+IG90aGVyLmQ7IAoJfQp9OwoKbGwgZGlzdF9zW05dOyAKbGwgZGlzdF90W05dOyAKbGwgZGlzdF9hW05dOyAKbGwgZGlzdF9iW05dOyAKCnZvaWQgZGlqa3N0cmEoaW50IHMsIGxsIGRpc3RbXSkgewoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSBkaXN0W3VdID0gTElORjsgIAoKCXByaW9yaXR5X3F1ZXVlPE5vZGU+IHBxOyAKCWRpc3Rbc10gPSAwOyAgCglwcS5wdXNoKHtzLCBkaXN0W3NdfSk7ICAKCgl3aGlsZSAoIXBxLmVtcHR5KCkpIHsKCQlOb2RlIGZyb250ID0gcHEudG9wKCk7IHBxLnBvcCgpOyAKCQlpbnQgdSA9IGZyb250LnU7IGxsIGQgPSBmcm9udC5kOyAgCgoJCWlmIChkID4gZGlzdFt1XSkgY29udGludWU7IAoKCQlmb3IgKGlpIHYgOiBhZGpbdV0pIHsKCQkJaWYgKG1pbmltaXplKGRpc3Rbdi5maXJzdF0sIGRpc3RbdV0gKyB2LnNlY29uZCkpIHsKCQkJCXBxLnB1c2goe3YuZmlyc3QsIGRpc3Rbdi5maXJzdF19KTsgCgkJCX0KCQl9Cgl9Cn0KCi8vIMSQw6FwIMOhbiBz4bq9IGPDsyBk4bqhbmcgYSAtPiAgeCAgLT4gIHkgIC0+ICBiIGhv4bq3YyBiICAtPiAgeCAgLT4gIHkgIC0+IGEKLy8gaGF5IAkJCQkgZGlzdF9hW3hdICsgZGlzdF9iW3ldIGhv4bq3YyBkaXN0X2JbeF0gKyBkaXN0X2FbeV0KLy8gVuG7m2kgxJHGsOG7nW5nIMSRaSB4IC0+IHkgdGh14buZYyB2w6BvIG3hu5l0IMSRxrDhu51uZyDEkWkgbmfhuq9uIG5o4bqldCBuw6BvIMSR4bqleSDEkWkgdOG7qyBzIMSR4bq/biB0IAovLyBoYXkgeCAtPiB5IGzDoCBt4buZdCDEkcaw4budbmcgxJFpIHRyw6puIMSR4buTIHRo4buLIMSRxrDhu51uZyDEkWkgbmfhuq9uIG5o4bqldCBj4bunYSBzLCB0Cgp2ZWN0b3I8aW50PiBnW05dOyAKCmxsIG1lbW9bTl07ICAKCi8vIGRwX2EoeCkgPSBtaW4oe2Rpc3RfYSh5KX0pIHbhu5tpIG3hu41pIHkgc2FvIGNobyB04buTbiB04bqhaSDEkcaw4budbmcgxJFpIHggLT4geSB0csOqbiDEkeG7kyB0aOG7iyDEkcaw4budbmcgxJFpIG5n4bqvbiBuaOG6pXQgCmxsIGRwX2EoaW50IHgpIHsKCWxsJiBhbnMgPSBtZW1vW3hdOyAgCglpZiAoYW5zICE9IC0xKSByZXR1cm4gYW5zOyAKCWFucyA9IGRpc3RfYVt4XTsgIAoJZm9yIChpbnQgbnh0X3ggOiBnW3hdKSB7CgkJbWluaW1pemUoYW5zLCBkcF9hKG54dF94KSk7IAoJfQoJcmV0dXJuIGFuczsgCn0KCi8vIGRwX2IoeCkgPSBtaW4oe2Rpc3RfYih5KX0pIHbhu5tpIG3hu41pIHkgc2FvIGNobyB04buTbiB04bqhaSDEkcaw4budbmcgxJFpIHggLT4geSB0csOqbiDEkeG7kyB0aOG7iyDEkcaw4budbmcgxJFpIG5n4bqvbiBuaOG6pXQKbGwgZHBfYihpbnQgeCkgewoJbGwmIGFucyA9IG1lbW9beF07ICAKCWlmIChhbnMgIT0gLTEpIHJldHVybiBhbnM7IAoJYW5zID0gZGlzdF9iW3hdOyAKCWZvciAoaW50IG54dF94IDogZ1t4XSkgewoJCW1pbmltaXplKGFucywgZHBfYihueHRfeCkpOyAKCX0KCXJldHVybiBhbnM7IAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbiA+PiBtOyAKCWNpbiA+PiBzID4+IHQ7IAoJY2luID4+IGEgPj4gYjsgICAKCglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCB1LCB2LCB3OyAKCQljaW4gPj4gdSA+PiB2ID4+IHc7IAoJCWFkalt1XS5wdXNoX2JhY2soe3YsIHd9KTsgCgkJYWRqW3ZdLnB1c2hfYmFjayh7dSwgd30pOyAKCX0KCgkvLyBCdWlsZCDEkeG7kyB0aOG7iyDEkcaw4budbmcgxJFpIG5n4bqvbiBuaOG6pXQgduG7m2kgxJHhu4luaCB4deG6pXQgcGjDoXQgcywgxJHhu4luaCBr4bq/dCB0aMO6YyB0CglkaWprc3RyYShzLCBkaXN0X3MpOyAKCWRpamtzdHJhKHQsIGRpc3RfdCk7IAoJCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKCQlmb3IgKGlpIHYgOiBhZGpbdV0pIHsKCQkJaWYgKGRpc3Rfc1t1XSArIHYuc2Vjb25kICsgZGlzdF90W3YuZmlyc3RdID09IGRpc3Rfc1t0XSkgewoJCQkJZ1t1XS5wdXNoX2JhY2sodi5maXJzdCk7IAoJCQl9CgkJfQoJfQoKCWRpamtzdHJhKGEsIGRpc3RfYSk7IAoJZGlqa3N0cmEoYiwgZGlzdF9iKTsgCgoJLy8gVHLGsOG7nW5nIGjhu6NwIGEgLT4geCAtPiB5IC0+IGIKCW1lbXNldChtZW1vLCAtMSwgc2l6ZW9mIG1lbW8pOyAgCglsbCBhbnMgPSBkaXN0X2FbYl07IAoJZm9yIChpbnQgeCA9IDE7IHggPD0gbjsgeCsrKSB7CgkJbWluaW1pemUoYW5zLCBkaXN0X2FbeF0gKyBkcF9iKHgpKTsgCgl9CgoJLy8gVHLGsOG7nW5nIGjhu6NwIGIgLT4geCAtPiB5IC0+IGEKCW1lbXNldChtZW1vLCAtMSwgc2l6ZW9mIG1lbW8pOyAgCglmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKCQltaW5pbWl6ZShhbnMsIGRpc3RfYlt4XSArIGRwX2EoeCkpOyAKCX0KCgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==