#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MOD = 998244353;
const int mxN = 1e5+5;
template <typename T>
using pq = priority_queue<T, vector<T>, greater<T>>;
vector<vector<pii>> adj;
vector<ll> du, dv, ds;
ll dp[mxN][2];
void dijkstra1(int s, vector<ll> &dis) {
dis.assign(mxN, 1e18);
pq<pair<ll, int>> q;
q.push({0, s});
dis[s] = 0;
while (!q.empty()) {
auto [w, u] = q.top();
q.pop();
if (w!=dis[u]) continue;
for (auto [v, p] : adj[u]) {
if (dis[v] > dis[u]+p) {
dis[v] = dis[u]+p;
q.push({dis[v], v});
}
}
}
}
ll ans;
void dijkstra2(int s, int t) {
//s es el source
for (int i=0; i<mxN; i++) {
dp[i][0] = dp[i][1] = 1e18;
}
ds.assign(mxN, 1e18);
vector<bool> vis(mxN, false);
pq<pair<ll, pii>> q;
q.push({0, {s, mxN-1}});
while (!q.empty()) {
auto [w, e] = q.top();
auto [u, p] = e;
q.pop();
if (!vis[u]) {
vis[u] = true;
ds[u] = w;
dp[u][0] = min(du[u], dp[p][0]);
dp[u][1] = min(dp[u][0] + dv[u], dp[p][1]);
for (auto [v, peso] : adj[u]) {
q.push({w+peso, {v, u}});
}
}
else if (ds[u] == w) {
dp[u][0] = min(dp[u][0], dp[p][0]);
dp[u][1] = min({
dp[u][1], dp[u][0]+dv[u], dp[p][1]
});
}
}
ans = min(ans, dp[t][1]);
}
void solve() {
int n, m, s, t, u, v;
cin >> n >> m >> s >> t >> u >> v;
adj.assign(n, {});
s--; t--; u--; v--;
for (int i=0; i<m; i++) {
int a, b, c; cin >> a >> b >> c;
a--; b--;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
dijkstra1(u, du);
dijkstra1(v, dv);
ans = du[v];
dijkstra2(s, t);
dijkstra2(t, s);
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t=1;
while (t--) {
solve();
}
return 0;
}