#include <bits/stdc++.h>
using namespace std;
#define tup tuple<long long,int,int>
const long long INF = 1e18;
const int N = 1e5+5;
int n,m,s,t,U,V;
vector<pair<int, int>> adj[N];
long long sdist[N], rdist[N], dist[3][N];
void prepare() {
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
fill(sdist, sdist+N, INF);
sdist[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > sdist[u]) continue;
for (auto [v, w] : adj[u]) {
if (sdist[v] > sdist[u] + w) {
sdist[v] = sdist[u]+w;
pq.push({sdist[v],v});
}
}
}
fill(rdist, rdist+N, INF);
rdist[t] = 0;
pq.push({0, t});
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > rdist[u]) continue;
for (auto [v,w] : adj[u]) {
if (rdist[v] > rdist[u] + w) {
rdist[v] = rdist[u] + w;
pq.push({rdist[v], v});
}
}
}
}
bool checkpath(int u, int v, int w) {
return (sdist[u] + rdist[v] + w == sdist[t] || sdist[v] + rdist[u] + w == sdist[t]);
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin>> n>> m>> s>> t>> U>> V;
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});
}
prepare();
for (int i=0; i<3; i++) for (int j=0; j<N; j++) dist[i][j] = INF;
priority_queue<tup, vector<tup>, greater<tup>> pq;// state 0 == not used // 1 == using // 2 == used
pq.push({0, 0, U});
dist[0][U] = 0;
while (!pq.empty()) {
auto [d, state, u] = pq.top(); pq.pop();
if (d > dist[state][u]) continue;
for (auto [v, w] : adj[u]) {
if (state == 0) {
if (checkpath(u, v, w)) {
if (dist[1][v] > dist[0][u]) {
dist[1][v] = dist[0][u];
pq.push({dist[1][v], 1, v});
}
}
if (dist[0][v] > dist[0][u] + w) {
dist[0][v] = dist[0][u] + w;
pq.push({dist[0][v], 0, v});
}
}
else if (state == 1) {
if (checkpath(u, v, w)) {
if (dist[1][v] > dist[1][u]) {
dist[1][v] = dist[1][u];
pq.push({dist[1][v], 1, v});
}
}
if (dist[2][v] > dist[1][u] + w) {
dist[2][v] = dist[1][u] + w;
pq.push({dist[2][v], 2, v});
}
}
else {
if (dist[2][v] > dist[2][u]+w) {
dist[2][v] = dist[2][u] + w;
pq.push({dist[2][v], 2, v});
}
}
}
}
long long ans = INF;
for (int i=0; i<3; i++) ans = min(ans, dist[i][V]);
cout<< ans;
}