# include <bits/stdc++.h>
using namespace std;
# define int long long
const int N = 1e6 + 10;
int n, m, s, t1, t2, u, v, w;
int ans[N], pos;
bool vis[N];
struct Edge
{
int next, to, val;
}edge[N];
int head[N], cnt;
void add(int u, int v, int w)
{
edge[++cnt] = {head[u], v, w};
head[u] = cnt;
}
int dijkstra1(int s, int t)
{
for (int i = 1; i <= n; ++i) ans[i] = INT_MAX, vis[i] = false;
ans[s] = 0;
int pos = s;
while (vis[pos] == false) {
int minn = INT_MAX;
vis[pos] = true;
for (int i = head[pos]; i != 0; i = edge[i].next)
if (vis[edge[i].to] == false && ans[edge[i].to] > ans[pos] + edge[i].val)
ans[edge[i].to] = ans[pos] + edge[i].val;
for (int i = 1; i <= n; ++i)
if (ans[i] < minn && vis[i] == false)
minn = ans[i], pos = i;
}
return ans[t];
}
int dijkstra2(int s, int t1, int t2)
{
for (int i = 1; i <= n; ++i) ans[i] = INT_MAX, vis[i] = false;
ans[s] = 0;
int pos = s;
while (vis[pos] == false) {
int minn = INT_MAX;
vis[pos] = true;
for (int i = head[pos]; i != 0; i = edge[i].next)
if (vis[edge[i].to] == false && ans[edge[i].to] > ans[pos] + edge[i].val)
ans[edge[i].to] = ans[pos] + edge[i].val;
for (int i = 1; i <= n; ++i)
if (ans[i] < minn && vis[i] == false)
minn = ans[i], pos = i;
}
return min(ans[t1], ans[t2]);
}
signed main()
{
ios :: sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> m >> n >> s >> t1 >> t2;
for (int i = 1; i <= m; ++i) {
cin >> u >> v >> w;
add(u, v, w), add(v, u, w);
}
cout << dijkstra1(t1, t2) + dijkstra2(s, t1, t2) << endl;
return 0;
}
验证码wtfm