#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
const int maxm = 2e5;
const ll INF = 1e18;
int n, m, S, T, U, V;
ll d[305][305];
vector <pair<int, int>> adj[maxn+5];
void read() {
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({v, w});
adj[v].push_back({u, w});
}
}
void FW() {
for (int i = 1; i<=n; ++i) {
for (int j = 1; j<=n; ++j)
d[i][j] = (i != j ? INF : 0);
}
for (int u = 1; u<=n; ++u) {
for (pair <int, int> e : adj[u]) {
int v = e.first, w = e.second;
d[u][v] = min(d[u][v], 1LL * w);
d[v][u] = min(d[v][u], 1LL * w);
}
}
for (int k = 1; k<=n; ++k) {
for (int i = 1; i<=n; ++i) {
for (int j = 1; j<=n; ++j) {
if (d[i][k] != INF && d[k][j] != INF)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
void sub3() {
FW();
ll res = INF;
for (int L = 1; L<=n; ++L) {
for (int R = 1; R<=n; ++R) {
if (d[L][R] + d[S][L] + d[R][T] == d[S][T]) {
res = min(res, d[U][L] + d[R][V]);
res = min(res, d[V][L] + d[R][U]);
}
}
}
cout << min(res, d[U][V]);
}
void sub1() {
}
void solve() {
/*
if (S == U) {
sub1();
return;
}
*/
if (n <= 300) {
sub3();
return;
}
}
int main() {
// freopen("commuter_pass.inp", "r", stdin);
// freopen("commuter_pass.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
read();
solve();
return 0;
}