#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 30005;
// Lista de adiacenta: pentru fiecare sat retinem perechi (vecin, distanta cu semn).
vector< pair<int, int> > g[NMAX];
long long poz[NMAX]; // pozitia fiecarui sat pe axa, relativ la X (X are pozitia 0)
bool vizitat[NMAX];
int main() {
freopen("sate.in", "r", stdin);
freopen("sate.out", "w", stdout);
int n, m, x, y;
scanf("%d %d %d %d", &n, &m, &x, &y);
for (int k = 0; k < m; k++) {
int i, j, d;
scanf("%d %d %d", &i, &j, &d);
// Satele sunt asezate in ordine pe axa, deci j (i < j) e la dreapta lui i.
// Mergand de la i la j pozitia creste cu d, de la j la i scade cu d.
g[i].push_back(make_pair(j, d));
g[j].push_back(make_pair(i, -d));
}
// BFS din X: fixam X ca origine (pozitia 0) si calculam pozitia
// fiecarui sat la care putem ajunge prin relatiile cunoscute.
queue<int> q;
q.push(x);
vizitat[x] = true;
poz[x] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
if (u == y) break; // am aflat pozitia lui Y, nu mai e nevoie sa continuam
for (size_t idx = 0; idx < g[u].size(); idx++) {
int v = g[u][idx].first;
int d = g[u][idx].second;
if (!vizitat[v]) {
vizitat[v] = true;
poz[v] = poz[u] + d; // pozitia vecinului = pozitia curenta + deplasarea
q.push(v);
}
}
}
// Distanta dintre X si Y = diferenta pozitiilor, in modul.
long long rez = poz[y] - poz[x];
if (rez < 0) rez = -rez;
printf("%lld\n", rez);
return 0;
}