// Day Created: mar 17th 2026
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define fname ""
#define ll long long
#define pii pair<int, int>
#define pli pair<ll, int>
#define fi first
#define se second
using namespace std;
int n, m, S, T, U, V;
vector<pii> edge[100005];
ll distU[100005], distV[100005], dp[2][100005], dist[100005];
priority_queue<pli, vector<pli>, greater<pli>> pq;
void dijktra(ll dist[], const int &s) {
fill(dist+1, dist+n+1, 1e16);
dist[s]=0;
pq.push({0, s});
while(!pq.empty()) {
auto [d, u]=pq.top();
pq.pop();
if(d!=dist[u]) continue;
for(const auto &[v, w]:edge[u])
if(dist[v]>d+w)
dist[v]=d+w, pq.push({dist[v], v});
}
}
ll answer(const int &s, const int &t) {
fill(dp[0]+1, dp[0]+n+1, 1e16);
fill(dp[1]+1, dp[1]+n+1, 1e16);
fill(dist+1, dist+n+1, 1e16);
dp[0][s]=distU[s], dp[1][s]=distU[s]+distV[s];
dist[s]=0;
pq.push({0, s});
while(!pq.empty()) {
auto [d, u]=pq.top();
pq.pop();
if(d!=dist[u]) continue;
for(const auto &[v, w]:edge[u])
if(dist[v]+w==d)
dp[0][u]=min(distU[u], dp[0][v]);
for(const auto &[v, w]:edge[u])
if(dist[v]+w==d)
dp[1][u]=min(dp[1][v], dp[0][u]+distV[u]);
for(const auto &[v, w]:edge[u])
if(dist[v]>d+w)
dist[v]=d+w, pq.push({dist[v], v});
}
return dp[1][t];
}
void solve() {
cin>>n>>m>>S>>T>>U>>V;
while(m--) {
int u, v, w;
cin>>u>>v>>w;
edge[u].emplace_back(make_pair(v, w));
edge[v].emplace_back(make_pair(u, w));
}
dijktra(distU, U);
dijktra(distV, V);
cout<<min(answer(S, T), answer(T, S));
}
main() {
if(fopen(fname".inp", "r")) {
freopen(fname".inp", "r", stdin);
freopen(fname".out", "w", stdout);
}
cin.tie(0)->sync_with_stdio(0);
int tc=1;
// cin>>tc;
while(tc--) {
solve();
cout<<'\n';
}
}