#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define s second
#define f first
typedef pair<ll, ll> pii;

const ll INF = 1e16;
const int N = 1e5 + 1;
vector<pii> graf[N];


void dijkstra(int start, vector<ll>& odl){
    odl[start] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, start});

    while(!pq.empty()){
        ll w = pq.top().f;
        ll v = pq.top().s;
        pq.pop();

        if(w > odl[v]) continue;
        for(pii x : graf[v]){
            ll u = x.f;
            ll waga = x.s;

            ll n_dyst = waga + w;
            if(n_dyst < odl[u]){
                odl[u] = n_dyst;
                pq.push({n_dyst, u});
            }
        }
    }

}


int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);


    int n, m;
    cin >> n >> m;

    int s, t, u, v;
    cin >> s >> t >> u >> v;

    vector<pair<pair<int, int>, ll>> kraw(m);
    vector<int> graf2[n + 1], graf3[n + 1];
    for(int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        graf[a].push_back({b, c});
        graf[b].push_back({a, c});
        kraw[i] = {{a, b}, c};
    }

    vector<ll> du(N, INF), dv(N, INF), ds(N, INF), dt(N, INF);

    dijkstra(s, ds);
    dijkstra(v, dv);
    dijkstra(t, dt);
    dijkstra(u, du);

    ll najk = ds[t];
    vector<int> czy(N, 0);
    vector<int> topo1, topo2;
    for(int i = 1; i <= n; i++){
        if(ds[i] + dt[i] == najk && najk != INF){
            czy[i] = 1;
        }
    }

    vector<int> stopien1(n + 1, 0), stopien2(n + 1, 0);
    for(auto kr : kraw){
        int a = kr.f.f, b = kr.f.s;
        int w = kr.s;

        if(ds[a] + w == ds[b] && czy[a] == 1 && czy[b] == 1){
            graf2[a].push_back(b);
            stopien1[b]++;
        }
        if(ds[b] + w == ds[a] && czy[a] == 1 && czy[b] == 1){
            graf2[b].push_back(a);
            stopien1[a]++;
        }
        if(dt[a] + w == dt[b] && czy[a] == 1 && czy[b] == 1){
            graf3[a].push_back(b);
            stopien2[b]++;
        }
        if(dt[b] + w == dt[a] && czy[a] == 1 && czy[b] == 1){
            graf3[b].push_back(a);
            stopien2[a]++;
        }

    }

    queue<int> q;
    for(int i = 1; i <= n; i++){
        if(czy[i] == 1 && stopien1[i] == 0){
            q.push(i);
        }
    }

    while(!q.empty()){
        int x = q.front(); q.pop();
        topo1.push_back(x);

        for(int y : graf2[x]){
            stopien1[y]--;
            if(stopien1[y] == 0){
                q.push(y);
            }
        }
    }

    vector<ll> dp1(n + 1, INF), dp2(n + 1, INF);
    for(int i : topo1){
        dp1[i] = du[i];
    }

    for(int i : topo1){
        for(int j : graf2[i]){
            if(dp1[j] > dp1[i]) dp1[j] = dp1[i];
        }
    }

    for(int i = 1; i <= n; i++){
        if(czy[i] == 1 && stopien2[i] == 0){
            q.push(i);
        }
    }

    while(!q.empty()){
        int x = q.front(); q.pop();
        topo2.push_back(x);

        for(int y : graf3[x]){
            stopien2[y]--;
            if(stopien2[y] == 0){
                q.push(y);
            }
        }
    }

    for(int i : topo2){
        dp2[i] = du[i];
    }

    for(int i : topo2){
        for(int j : graf3[i]){
            if(dp2[j] > dp2[i]) dp2[j] = dp2[i];
        }
    }

    ll ans = du[v];
    for(int x : topo1){
        ans = min(ans, min(dp1[x] + dv[x], dp2[x] + dv[x]));
    }
    cout << ans;


    return 0;
}
