#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;
int main() {
ifstream fin("sate.in");
ofstream fout("sate.out");
int N, M, X, Y;
fin >> N >> M >> X >> Y;
vector<vector<pair<int, int>>> lista(N + 1);
for (int k = 0; k < M; k++) {
int i, j, D;
fin >> i >> j >> D;
lista[i].push_back({j, D});
lista[j].push_back({i, -D});
}
// sate(lista, X, Y)
vector<int> dist_X(N + 1, -1);
dist_X[X] = 0;
queue<int> coada;
coada.push(X);
vector<bool> vizitat(N + 1, false);
vizitat[X] = true;
while (!coada.empty()) {
int nod = coada.front();
coada.pop();
for (auto [vecin, d] : lista[nod]) {
if (!vizitat[vecin]) {
vizitat[vecin] = true;
dist_X[vecin] = dist_X[nod] + d;
coada.push(vecin);
}
}
}
fout << abs(dist_X[Y]) << "\n";
return 0;
}