#include <fstream>
#include <vector>
#include <queue>
using namespace std;
// Idee: satele sunt pe o dreapta, deci fiecarui sat ii putem da o "pozitie".
// Pornim din X cu pozitia 0 si facem BFS: daca stim pozitia lui i si
// stim ca j e la D km la dreapta de i, atunci pozitie[j] = pozitie[i] + D
// (si invers pozitie[i] = pozitie[j] - D). La final raspunsul e |pozitie[Y]|.
ifstream fin("sate.in");
ofstream fout("sate.out");
const int NMAX = 30005;
int n, m, x, y;
vector< pair<int, int> > G[NMAX]; // (vecin, deplasare cu semn)
int pozitie[NMAX];
bool viz[NMAX];
int main() {
fin >> n >> m >> x >> y;
for (int k = 1; k <= m; k++) {
int i, j, d;
fin >> i >> j >> d;
if (i > j) { // in enunt i < j, dar sa fim siguri
int aux = i;
i = j;
j = aux;
}
G[i].push_back(make_pair(j, d)); // j e la dreapta lui i
G[j].push_back(make_pair(i, -d)); // i e la stanga lui j
}
queue<int> q;
q.push(x);
viz[x] = true;
pozitie[x] = 0;
while (!q.empty()) {
int nod = q.front();
q.pop();
for (size_t k = 0; k < G[nod].size(); k++) {
int vecin = G[nod][k].first;
int d = G[nod][k].second;
if (!viz[vecin]) {
viz[vecin] = true;
pozitie[vecin] = pozitie[nod] + d;
q.push(vecin);
}
}
}
int rez = pozitie[y];
if (rez < 0)
rez = -rez;
fout << rez << "\n";
return 0;
}