#include <bits/stdc++.h>
using namespace std;
#define task "C"
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
template <typename T1, typename T2> bool mini(T1 &a, T2 b) {
if (a > b) {a = b; return true;} return false;
}
template <typename T1, typename T2> bool maxi(T1 &a, T2 b) {
if (a < b) {a = b; return true;} return false;
}
const long long INF = 1e18;
const int N = 1e5 + 4;
int n, m;
int S, T;
int U, V;
long long d[N][4];
long long dp[N][2];
vector<pair<int, int>> adj[N];
void Dijkstra(int s, int type) {
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
for (int i = 1; i <= n; i++) d[i][type] = INF; pq.push(make_pair(0, s)); d[s][type] = 0;
while (pq.size()) {
long long du = pq.top().fi;
int u = pq.top().se;
pq.pop();
if (du != d[u][type]) continue;
for (pair<int, int> x: adj[u]) {
int v = x.fi, w = x.se;
if (mini(d[v][type], du + w))
pq.push(make_pair(d[v][type], v));
}
}
}
main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp","r")) {
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin >> n >> m;
cin >> S >> T;
cin >> U >> V;
for (int i = 1; i <= m; i++) {
int u, v, w; cin >> u >> v >> w;
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
Dijkstra(S, 0); Dijkstra(T, 1);
Dijkstra(U, 2); Dijkstra(V, 3);
for (int i = 1; i <= n; i++)
dp[i][0] = dp[i][1] = INF;
// calc array dp[_][__]
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
for (int i = 1; i <= n; i++) {
if (d[i][0] + d[i][1] == d[T][0])
pq.push(make_pair(d[i][0], i));
}
while (pq.size()) {
long long du = pq.top().fi;
int u = pq.top().se;
pq.pop();
mini(dp[u][0], d[u][2]);
mini(dp[u][1], d[u][3]);
for (pair<int, int> x: adj[u]) {
int v = x.fi, w = x.se;
if (du + w + d[v][1] == d[T][0]) {
mini(dp[v][0], dp[u][0]);
mini(dp[v][1], dp[u][1]);
}
}
}
long long ans = d[V][2];
for (int i = 1; i <= n; i++) {
if (d[i][0] + d[i][1] == d[T][0]) {
mini(ans, dp[i][0] + d[i][3]);
mini(ans, dp[i][1] + d[i][2]);
}
}
cout << ans;
}