#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define vl vector<ll>
#define vi vector<int>
#define pb push_back
#define sz(v) (ll)(v.size())
#define f first
#define s second
#define pll pair<ll, ll>
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
const ll sz = 2e5+5;
vector<pll>g[sz];
vl par[sz], g2[sz], ord;
ll dist[3][sz], mn[2][sz];
bool vis[sz];
void dijkstra(ll node, ll tt, ll n)
{
for(ll i = 0; i <= n; i++)
{
dist[tt][i] = 1000000000000000;
vis[i] = 0;
}
dist[tt][node] = 0;
priority_queue<pll>pq;
pq.push({0, node});
while(!pq.empty())
{
ll nd = pq.top().s;
pq.pop();
if(vis[nd])
continue;
vis[nd] = 1;
for(auto [h, w] : g[nd])
{
if(dist[tt][h] > dist[tt][nd] + w)
{
dist[tt][h] = dist[tt][nd] + w;
pq.push({-dist[tt][h], h});
}
}
}
}
void d2(ll node, ll n)
{
for(ll i = 0; i <= n; i++)
{
dist[2][i] = 1000000000000000;
vis[i] = 0;
}
dist[2][node] = 0;
priority_queue<pll>pq;
pq.push({0, node});
while(!pq.empty())
{
ll nd = pq.top().s;
pq.pop();
if(vis[nd])
continue;
vis[nd] = 1;
for(auto [h, w] : g[nd])
{
if(dist[2][h] > dist[2][nd] + w)
{
dist[2][h] = dist[2][nd] + w;
par[h].clear();
par[h].pb(nd);
pq.push({-dist[2][h], h});
}
else if(dist[2][h] == dist[2][nd] + w)
par[h].pb(nd);
}
}
}
void dfs(ll node)
{
vis[node] = 1;
for(auto u : par[node])
{
g2[u].pb(node);
if(vis[u])
continue;
dfs(u);
}
}
void dfs2(ll node)
{
vis[node] = 1;
for(auto u : g2[node])
{
if(vis[u])
continue;
dfs2(u);
}
ord.pb(node);
}
void solve()
{
ll n, m, i, j;
cin >> n >> m;
ll u, v, s, t;
cin >> s >> t;
cin >> u >> v;
for(i = 1; i <= m; i++)
{
ll x, y, z;
cin >> x >> y >> z;
g[x].pb({y, z});
g[y].pb({x, z});
}
dijkstra(u, 0, n);
dijkstra(v, 1, n);
d2(s, n);
for(i = 0; i <= n; i++)
vis[i] = 0;
dfs(t);
for(i = 0; i <= n; i++)
vis[i] = 0;
dfs2(s);
reverse(all(ord));
for(i = 0; i <= n; i++)
mn[0][i] = mn[1][i] = 1000000000000000;
ll res = LLONG_MAX;
for(auto h : ord)
{
for(j = 0; j < 2; j++)
{
mn[j][h] = min(mn[j][h], dist[j][h]);
res = min(res, mn[j][h] + dist[1-j][h]);
}
for(auto r : g2[h])
{
for(j = 0; j < 2; j++)
mn[j][r] = min(mn[j][r], mn[j][h]);
}
}
cout << min(dist[0][v], res) << "\n";
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll tests = 1;
//cin >> tests;
while(tests--)
{
solve();
}
}