#include <bits/stdc++.h>
#define maxn 100005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int n, m, S, T, U, V;
int64_t kc[maxn], ck[maxn];
vector<ii> adj[maxn];
vector<int> g[maxn];
vector<int> tg[maxn];
int64_t tc[maxn], ct[maxn];
void dijkstra1() {
    for (int i = 1; i <= n; i++) kc[i] = ck[i] = LLONG_MAX/2;
    kc[S] = ck[T] = 0;
    set<pair<int64_t, int> > q;
    q.insert({0, S});
    while (!q.empty()) {
        int u = q.begin()->se; q.erase(q.begin());
        for (auto [v, l] : adj[u])
        if (kc[v] > kc[u] + l) {
            q.erase({kc[v], v});
            kc[v] = kc[u] + l;
            q.insert({kc[v], v});
        }
    }
    q.insert({0, T});
    while (!q.empty()) {
        int u = q.begin()->se; q.erase(q.begin());
        for (auto [v, l] : adj[u])
        if (ck[v] > ck[u] + l) {
            q.erase({ck[v], v});
            ck[v] = ck[u] + l;
            q.insert({ck[v], v});
        }
    }
}
void dijkstra2() {
    for (int i = 1; i <= n; i++) tc[i] = ct[i] = LLONG_MAX/2;
    tc[U] = ct[V] = 0;
    set<pair<int64_t, int> > q;
    q.insert({0, U});
    while (!q.empty()) {
        int u = q.begin()->se; q.erase(q.begin());
        for (auto [v, l] : adj[u])
        if (tc[v] > tc[u] + l) {
            q.erase({tc[v], v});
            tc[v] = tc[u] + l;
            q.insert({tc[v], v});
        }
    }
    q.insert({0, V});
    while (!q.empty()) {
        int u = q.begin()->se; q.erase(q.begin());
        for (auto [v, l] : adj[u])
        if (ct[v] > ct[u] + l) {
            q.erase({ct[v], v});
            ct[v] = ct[u] + l;
            q.insert({ct[v], v});
        }
    }
}
int x[maxn], id = 0, cl[maxn];
void dfs(int u) {
    cl[u] = 1;
    for (int v : g[u])
        if (!cl[v]) dfs(v);
    x[++id] = u;
}
int64_t A[maxn], B[maxn];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m >> S >> T >> U >> V;
    for (int i = 1; i <= m; i++) {
        int u, v, l;
        cin >> u >> v >> l;
        adj[u].emplace_back(v, l);
        adj[v].emplace_back(u, l);
    }
    dijkstra1(); dijkstra2();
    int64_t mindis = kc[T];
    for (int u = 1; u <= n; u++)
        for (auto [v, l] : adj[u]) {
            if (kc[u] + l + ck[v] == mindis) {
                g[u].emplace_back(v);
                tg[v].emplace_back(u);
            }
        }
    int64_t ans = tc[V];
//    cout << "------------------\n";
//    for (int i = 1; i <= n; i++) cout << tc[i] << ' ' << ct[i] << "\n";
//    cout << "------------------\n";
    for (int i = 1; i <= n; i++) if (!cl[i]) dfs(i);
    for (int i = 1; i <= n; i++) {
        A[i] = tc[i];
        B[i] = ct[i];
    }
    for (int i = 1; i <= n; i++) {
        int u = x[i];
        for (int v : g[u]) A[u] = min(A[u], A[v]);
    }
    for (int i = n; i >= 1; i--) {
        int u = x[i];
        for (int v : tg[u]) B[u] = min(B[u], B[v]);
    }
    for (int i = 1; i <= n; i++) ans = min(ans, A[i] + B[i]);
    for (int i = 1; i <= n; i++) {
        A[i] = ct[i];
        B[i] = tc[i];
    }
    for (int i = 1; i <= n; i++) {
        int u = x[i];
        for (int v : g[u]) A[u] = min(A[u], A[v]);
    }
    for (int i = n; i >= 1; i--) {
        int u = x[i];
        for (int v : tg[u]) B[u] = min(B[u], B[v]);
    }
    for (int i = 1; i <= n; i++) ans = min(ans, A[i] + B[i]);
    cout << ans;
}
/*
 6 6
 1 6
 1 4
 1 2 1
 2 3 1
 3 5 1
 2 4 3
 4 5 2
 5 6 1
 */
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |