#include <bits/stdc++.h>
using namespace std;
#define nitro ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define int long long
#define vi vector<int>
#define spc ' '
#define yes "YES"
#define no "NO"
#define endl "\n"
const int inf = 1e18;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
const int logn = 20;
vector<pair<int,int>> adj[maxn], adj2[maxn];
vi dijkstra(int src, int n, vector<pair<int,int>> g[]) {
vi dist(n+1, inf);
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq;
dist[src] = 0;
pq.push({0, src});
while(!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if(d > dist[u]) continue;
for(auto [to, w] : g[u]) {
if(dist[u] + w < dist[to]) {
dist[to] = dist[u] + w;
pq.push({dist[to], to});
}
}
}
return dist;
}
void solve() {
int n, m; cin >> n >> m;
int s, t, u, v; cin >> s >> t >> u >> v;
for(int i = 0; i < m; i++) {
int a, b, c; cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
vi dS = dijkstra(s, n, adj);
vi dT = dijkstra(t, n, adj);
for(int a = 1; a <= n; a++) {
for(auto [b, c] : adj[a]) {
int w = c;
if(dS[a] + c + dT[b] == dS[t] || dS[b] + c + dT[a] == dS[t])
w = 0;
adj2[a].push_back({b, w});
}
}
vi dU = dijkstra(u, n, adj2);
cout << dU[v];
}
signed main() {
// freopen("mootube.in", "r", stdin);
// freopen("mootube.out", "w", stdout);
nitro
int t = 1;
// cin >> t;
for(int i = 1; i <= t; i++) {
// cout << "Case #" << i << ": ";
solve();
cout << endl;
}
return 0;
}