#include <bits/stdc++.h>
using namespace std;
void Init()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
typedef long long ll;
const ll INF = 4e18;
const int maxn = 100005;
int n, m;
int S, T, U, V;
struct Edge
{
int v;
ll w;
};
vector<Edge> g[maxn];
vector<int> dag[maxn];
ll disS[maxn], disT[maxn], disU[maxn], disV[maxn];
ll best[maxn];
bool onPath[maxn];
void Dijkstra(int s, ll dis[])
{
for (int i = 1; i <= n; i++) dis[i] = INF;
priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
dis[s] = 0;
pq.push({0, s});
while (!pq.empty())
{
auto [d,u] = pq.top();
pq.pop();
if (d != dis[u]) continue;
for (auto e : g[u])
{
int v = e.v;
ll w = e.w;
if (dis[v] > d + w)
{
dis[v] = d + w;
pq.push({dis[v], v});
}
}
}
}
void Input()
{
cin >> n >> m;
cin >> S >> T >> U >> V;
for (int i = 1; i <= m; i++)
{
int u, v;
ll w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
}
void Bai()
{
Dijkstra(S, disS);
Dijkstra(T, disT);
Dijkstra(U, disU);
Dijkstra(V, disV);
for (int u = 1; u <= n; u++)
{
for (auto e : g[u])
{
int v = e.v;
ll w = e.w;
if (disS[u] + w == disS[v])
{
dag[u].push_back(v);
}
}
}
for (int i = 1; i <= n; i++)
{
if (disS[i] + disT[i] == disS[T])
onPath[i] = true;
else
onPath[i] = false;
}
vector<int> ord;
ord.reserve(n);
for (int i = 1; i <= n; i++)
ord.push_back(i);
sort(ord.begin(), ord.end(), [](int a, int b)
{
return disS[a] < disS[b];
});
for (int i = 1; i <= n; i++)
best[i] = INF;
for (int id = 0; id < n; id++)
{
int u = ord[id];
if (onPath[u])
best[u] = min(best[u], disU[u]);
for (int v : dag[u])
{
best[v] = min(best[v], best[u]);
}
}
ll ans = disU[V];
for (int i = 1; i <= n; i++)
{
if (onPath[i])
{
if (best[i] != INF && disV[i] != INF)
ans = min(ans, best[i] + disV[i]);
}
}
cout << ans << "\n";
}
int main()
{
Init();
Input();
Bai();
return 0;
}