#include <fstream>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
const int NMAX = 30005;
const int MMAX = 100030;
int n, m, x, y;
// Liste de adiacenta implementate cu vectori statici.
// Fiecare relatie (i, j, D) devine doua muchii: i -> j cu +D si j -> i cu -D.
int lst[NMAX]; // lst[u] = indicele primei muchii din lista lui u (0 = lista goala)
int vecin[2 * MMAX]; // vecin[k] = celalalt capat al muchiei k
int dist[2 * MMAX]; // dist[k] = deplasarea cu semn (+ spre dreapta, - spre stanga)
int urm[2 * MMAX]; // urm[k] = urmatoarea muchie din aceeasi lista
int nrm; // cate muchii am adaugat
long long poz[NMAX]; // pozitia fiecarui sat pe axa, relativ la X (X are pozitia 0)
bool vizitat[NMAX];
int coada[NMAX];
void adauga(int u, int v, int d) {
nrm++;
vecin[nrm] = v;
dist[nrm] = d;
urm[nrm] = lst[u];
lst[u] = nrm;
}
int main() {
fin >> n >> m >> x >> y;
for (int k = 1; k <= m; k++) {
int i, j, d;
fin >> i >> j >> d;
// Satele sunt in ordine pe axa, deci j (i < j) e la dreapta lui i:
// de la i la j pozitia creste cu d, de la j la i scade cu d.
adauga(i, j, d);
adauga(j, i, -d);
}
// BFS din X: fixam X ca origine si calculam pozitia satelor la care ajungem.
int st = 1, dr = 0;
coada[++dr] = x;
vizitat[x] = true;
poz[x] = 0;
while (st <= dr) {
int u = coada[st++];
if (u == y) break; // am aflat pozitia lui Y, ne putem opri
for (int k = lst[u]; k != 0; k = urm[k]) {
int v = vecin[k];
if (!vizitat[v]) {
vizitat[v] = true;
poz[v] = poz[u] + dist[k]; // pozitia vecinului = pozitia curenta + deplasarea
coada[++dr] = v;
}
}
}
// Distanta dintre X si Y = diferenta pozitiilor, in modul.
long long rez = poz[y] - poz[x];
if (rez < 0) rez = -rez;
fout << rez << "\n";
return 0;
}