#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define FOR(i, l, r) for (int i = (l); i <= (r); i++)
#define FOD(i, r, l) for (int i = (r); i >= (l); i--)
#define fi first
#define se second
#define pii pair<int, int>
const ll mod = 1e9 + 7;
const ll MAXN = 1e6+5;
const ll oo = 1e18;
int n, m, s1, t1, s2, t2, f1[MAXN], f2[MAXN], chk[MAXN], f[MAXN][4];
vector<pii> adj[MAXN], adj1[MAXN];
struct note
{
    int u, v, c;
} canh[MAXN];
void dijkstra1()
{
    priority_queue<pii, vector<pii>, greater<pii>> q;
    FOR(i, 1, n)
    {
        f1[i] = oo;
    }
    f1[s1] = 0;
    q.push({0, s1});
    while (q.size())
    {
        auto [c, u] = q.top();
        q.pop();
        if (c > f1[u])
            continue;
        for (auto &[v, w] : adj[u])
        {
            if (f1[v] > f1[u] + w)
            {
                f1[v] = f1[u] + w;
                q.push({f1[v], v});
            }
        }
    }
}
void dijkstra2()
{
    priority_queue<pii, vector<pii>, greater<pii>> q;
    FOR(i, 1, n)
    {
        f2[i] = oo;
    }
    f2[t1] = 0;
    q.push({0, t1});
    while (q.size())
    {
        auto [c, u] = q.top();
        q.pop();
        if (c > f2[u])
            continue;
        for (auto &[v, w] : adj[u])
        {
            if (f2[v] > f2[u] + w)
            {
                f2[v] = f2[u] + w;
                q.push({f2[v], v});
            }
        }
    }
}
void dijkstra()
{
    priority_queue<pair<int, pii>, vector<pair<int, pii>>, greater<pair<int, pii>>> q;
    FOR(i, 1, n)
    {
        FOR(j, 0, 2)
        {
            f[i][j] = oo;
        }
    }
    f[s2][0] = 0;
    q.push({0, {s2, 0}});
    while (q.size())
    {
        int c = q.top().fi;
        auto [u, tt] = q.top().se;
        q.pop();
        if (c > f[u][tt])
        {
            continue;
        }
        for (auto &[v, w] : adj1[u])
        {
            FOR(j, 0, 2)
            {
                if (j == 1)
                    continue;
                if (f[v][j] > f[u][tt] + w)
                {
                    f[v][j] = f[u][tt] + w;
                    q.push({f[v][j], {v, j}});
                }
            }
            if (w == 0)
            {
                if (tt == 0)
                {
                    if (f[v][1] > f[u][0])
                    {
                        f[v][1] = f[u][0];
                        q.push({f[v][1], {v, 1}});
                    }
                }
                else if (tt == 1)
                {
                    if (f[v][1] > f[u][1])
                    {
                        f[v][1] = f[u][1];
                        q.push({f[v][1], {v, 1}});
                    }
                }
                else
                {
                    if (f[v][2] > f[u][2] + w)
                    {
                        f[v][2] = f[u][2] + w;
                        q.push({f[v][2], {v, 2}});
                    }
                }
            }
            else
            {
                if (tt == 0)
                {
                    if (f[v][0] > f[u][0] + w)
                    {
                        f[v][0] = f[u][0] + w;
                        q.push({f[v][0], {v, 0}});
                    }
                }
                else if (tt == 1)
                {
                    if (f[v][2] > f[u][1] + w)
                    {
                        f[v][2] = f[u][1] + w;
                        q.push({f[v][2], {v, 2}});
                    }
                }
                else
                {
                    if (f[v][2] > f[u][2] + w)
                    {
                        f[v][2] = f[u][2] + w;
                        q.push({f[v][2], {v, 2}});
                    }
                }
            }
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    if (fopen("DAYCON.inp", "r"))
    {
        freopen("DAYCON.inp", "r", stdin);
        freopen("DAYCON.out", "w", stdout);
    }
    cin >> n >> m >> s1 >> t1 >> s2 >> t2;
    FOR(i, 1, m)
    {
        int u, v, c;
        cin >> u >> v >> c;
        adj[u].push_back({v, c});
        adj[v].push_back({u, c});
        adj1[u].push_back({v, c});
        adj1[v].push_back({u, c});
        canh[i] = {u, v, c};
        canh[i+m]={v, u, c};
    }
    dijkstra1();
    dijkstra2();
    m*=2;
    FOR(i, 1, m)
    {
        auto [u, v, c] = canh[i];
        if (f1[u] + c + f2[v] == f1[t1])
        {
            adj1[u].push_back({v, 0});
        }
    }
    // cout << chk[4] << ' ';
    dijkstra();
    int ans = oo;
    FOR(i, 0, 2)
    {
        ans = min(ans, f[t2][i]);
    }
    FOR(i, 1, n)
    {
        adj1[i].clear();
    }
    FOR(i, 1, m)
    {
        auto [u, v, c] = canh[i];
        // adj1[v].push_back({u, c});
        adj1[u].push_back({v, c});
    }
    FOR(i, 1, m)
    {
        auto [u, v, c] = canh[i];
        if (f2[u] + c + f1[v] == f1[t1])
        {
            adj1[u].push_back({v, 0});
        }
    }
    dijkstra();
    FOR(i, 0, 2)
    {
        ans = min(ans, f[t2][i]);
    }
    cout << ans;
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:173:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  173 |         freopen("DAYCON.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:174:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  174 |         freopen("DAYCON.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |