#include #define R register int #define ll long long #define db double #define FOR(i, j, k) for (R i = j; i <= k; i++) #define DEC(i, j, k) for (R i = j; i >= k; i--) #define walk(i, u) for (R i = 0; i < g[u].size(); i++) #define visch(i, u) for (R i = head[u]; i; i = edge[i].next) using namespace std; inline int read() { int x = 0; bool flag = 0; int ch = getchar(); while ('0' > ch || ch > '9') { if (ch == '-') flag = 1; ch = getchar(); } while ('0' <= ch && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } return flag ? -x : x; } const int maxn = 2510, maxm = 6210; int n, m, s, t; struct E { int to, nxt, w; } edge[maxm << 1]; int head[maxn], ec; inline void adde(int u, int v, int w) { edge[++ec].to = v; edge[ec].nxt = head[u]; edge[ec].w = w; head[u] = ec; } deque q; ll dis[maxn]; bool vis[maxn]; inline void spfa() { FOR(i, 1, n) dis[i] = 0x3f3f3f3f3f3f3f3f; dis[s] = 0; vis[s] = 1; q.push_back(s); while (q.size()) { int u = q.front(); q.pop_front(); vis[u] = 0; for (int i = head[u]; i; i = edge[i].nxt) { int v = edge[i].to; if (dis[u] + edge[i].w < dis[v]) { dis[v] = dis[u] + edge[i].w; if (!vis[v]) q.push_back(v); } } } } int main() { n = read(), m = read(), s = read(), t = read(); FOR(i, 1, m) { int x = read(), y = read(), z = read(); adde(x, y, z); adde(y, x, z); } spfa(); printf("%lld", dis[t]); return 0; }