#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
#define optimizar_io ios_base::sync_with_stdio(0);cin.tie(0);
typedef pair<int, int> pii;
typedef pair<long long, int> pli;
typedef pair<pii, int> piii;
typedef pair<long long, long long> pll;
typedef pair<pll, long long> plll;
typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;
typedef vector<char> vc;
typedef vector<vector<int>> vvi;
typedef vector<long long> vl;
typedef vector<vector<char>> vvc;
typedef vector<vector<long long>> vvl;
typedef vector<pii> vpii;
typedef vector<piii> vpiii;
typedef vector<pli> vpli;
typedef vector<pll> vpll;
typedef vector<plll> vplll;
typedef vector<vector<plll>> vvplll;
typedef vector<vector<pll>> vvpll;
typedef vector<vector<piii>> vvpiii;
typedef vector<vector<pii>> vvpii;
typedef vector<vector<pli>> vvpli;
typedef long long ll;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define data data_
#define endl "\n"
#define isOn(S, j) ((S) & (1ll << (j)))
#define setBit(S, j) ((S) |= (1ll << (j)))
#define clearBit(S, j) ((S) &= ~(1ll << (j)))
#define toggleBit(S, j) (S ^= (1ll << (j)))
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
#define all(x) x.begin(),x.end()
#define sz(x) x.size()
#define dbg(v) cout << "Line(" << __LINE__ << ") -> " << #v << " = " << (v) << endl
void dijkstra(vector < vector < pair<long long, int> > > &connections, int from, long long distances[], int pre[], int &farthest, bool resetDist){
vector<bool> extracted(connections.size(), false);
if (resetDist) for (int i = 0; i < connections.size(); i++) distances[i] = LLONG_MAX;
distances[from] = 0;
pre[from] = -1;
priority_queue< pair<long long, int> , vector< pair<long long, int> >, greater< pair<long long, int > > > pq;
pq.push(make_pair(0, from));
while (!pq.empty()) {
auto front = pq.top();
pq.pop();
int u = front.second;
farthest = u;
if (extracted[u]) continue;
extracted[u] = true;
for (int j = 0; j < connections[u].size(); j++){
auto v = connections[u][j];
if (distances[u] + v.first < distances[v.second]) {
distances[v.second] = distances[u] + v.first;
pre[v.second] = u;
pq.push(make_pair(distances[v.second], v.second));
}
}
}
}
int main(){
optimizar_io;
int n, m; cin >> n >> m;
int s, t; cin >> s >> t; s--; t--;
int u, v; cin >> u >> v; u--; v--;
vvpli g(n);
for (int i = 0; i < m; i++){
int a, b; long long w; cin >> a >> b >> w;
a--; b--;
g[a].pb({w, b});
g[b].pb({w, a});
}
long long distS[n], distT[n];
int preS[n], preT[n];
int farthestS, farthestT;
dijkstra(g, s, distS, preS, farthestS, true);
dijkstra(g, t, distT, preT, farthestT, true);
vvi spg_st(n); //shortest path graph from s to t
vvi spgrev_st(n);
for (int i = 0; i < n; i++){
for (auto &p : g[i]){
if (distS[i] + p.fi + distT[p.se] == distS[t]){
spg_st[i].pb(p.se);
spgrev_st[p.se].pb(i);
}
}
}
vvpli model(4*n);
for (int i = 0; i < n; i++){
for (auto &p : g[i]){
model[i].pb({p.fi, p.se});
model[i+3*n].pb({p.fi, p.se+3*n});
}
model[i].pb({0, i+n});
model[i].pb({0, i+2*n});
model[i+n].pb({0, i+3*n});
model[i+2*n].pb({0, i+3*n});
}
for (int i = 0; i < n; i++){
for (auto &p : spg_st[i]){
model[i+n].pb({0, p+n});
}
}
for (int i = 0; i < n; i++){
for (auto &p : spgrev_st[i]){
model[i+2*n].pb({0, p+2*n});
}
}
long long distU[4*n];
int preU[4*n];
int farthestU;
dijkstra(model, u, distU, preU, farthestU, true);
cout << distU[v+3*n] << endl;
return 0;
}