#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mmod = 998244353;
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>
vector<vector<pl>> graf;
vl dis1, dis2;
void dijkstra(ll v, vl& dis){
ll n = dis.size();
priority_queue<pl> q ;
q.push({0, v});
vb vis (n, false);
while (!q.empty()){
pl prvek = q.top();
q.pop();
ll d, pos;
d = -prvek.first; pos = prvek.second;
if (vis[pos] == false){
vis[pos] = true;
dis[pos] = min(dis[pos], d);
for (auto x : graf[pos]){
q.push({-d - x.second, x.first});
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n, m, s, t, u, v;
cin >>n >> m >> s >>t >> u >> v;
s--; t--; u--; v--;
graf.resize(n);
for (ll i = 0; i < m; i++){
ll a,b,c;
cin >>a >>b >>c;
a--; b--;
graf[a].push_back({b,c});
graf[b].push_back({a,c});
}
dis1.resize(n, 2e18); dis2.resize(n, 2e18);
dijkstra(u, dis1);
dijkstra(v, dis2);
vl total, mini;
total.resize(n, 2e18), mini.resize(n, 2e18);
priority_queue<vl> q;
q.push({0,s,-1}); //dist, current, parent;
vb vis(n, false);
vl dist(n, 2e18);
while (!q.empty()){
auto prvek = q.top();
q.pop();
ll dis, v, prev;
dis = -prvek[0];
v = prvek[1];
prev = prvek[2];
if (dis <= dist[v]){
dist[v] = dis;
if (prev != -1){
total[v] = min(total[v], total[prev]);
mini[v] = min(mini[v], mini[prev]);
}
mini[v] = min(mini[v], dis1[v]);
total[v] = min(total[v], mini[v] + dis2[v]);
}
if (vis[v] == false){
vis[v] = true;
for (auto x : graf[v]){
q.push({-dis - x.second, x.first, v});
}
}
}
ll ans1 = total[t];
mini.clear();total.clear();
total.resize(n, 2e18), mini.resize(n, 2e18);
q.push({0,t,-1}); //dist, current, parent;
vis.clear();
vis.resize(n, false);
dist.clear(); dist.resize(n, 2e18);
while (!q.empty()){
auto prvek = q.top();
q.pop();
ll dis, v, prev;
dis = -prvek[0];
v = prvek[1];
prev = prvek[2];
if (dis <= dist[v]){
dist[v] = dis;
if (prev != -1){
total[v] = min(total[v], total[prev]);
mini[v] = min(mini[v], mini[prev]);
}
mini[v] = min(mini[v], dis1[v]);
total[v] = min(total[v], mini[v] + dis2[v]);
}
if (vis[v] == false){
vis[v] = true;
for (auto x : graf[v]){
q.push({-dis - x.second, x.first, v});
}
}
}
ll ans2 = total[s];
cout << min(dis2[u], min(ans1, ans2)) <<"\n";
return 0;
}