// https://www.infoarena.ro/problema/sate
// Complexitate: O(N+M) -> Fiecare sat este vizitat doar o data. In BFS() fiecare nod poate avea
// in total maxim 2M muchii (din prop. gradelor), deci avem O(N+2M) = O(N+M)
#include <bits/stdc++.h>
using namespace std;
// pune 0 daca pe pbinfo se cere citire de la tastatura (stdin/stdout)
#define FISIERE 1
#if FISIERE
ifstream fin("sate.in");
ofstream fout("sate.out");
#else
istream &fin = cin;
ostream &fout = cout;
#endif
int main() {
int N, M, X, Y;
fin >> N >> M >> X >> Y;
// cerr << N << " " << M << " " << X << " " << Y << "\n"; // print(N,M,X,Y)
vector<vector<pair<int, long long>>> drum(N + 1);
for (int i = 0; i < M; i++) {
int x, y;
long long d;
fin >> x >> y >> d;
drum[x].push_back({y, d}); // de la satul mic spre cel mare: +d
drum[y].push_back({x, -d}); // invers: -d
}
// for (int i = 1; i <= N; i++) ... // print(drum)
vector<char> vizitat(N + 1, 0);
vector<long long> lungime(N + 1, 0); // pozitia satului fata de X (inlocuieste coada2)
queue<int> coada;
coada.push(X);
vizitat[X] = 1;
lungime[X] = 0;
bool ok = false;
while (!coada.empty()) {
int tata = coada.front();
coada.pop();
if (tata == Y) {
ok = true;
fout << llabs(lungime[tata]) << "\n"; // posibil sa fie X > Y, de aceea abs
break;
}
for (auto &p : drum[tata]) {
int vec = p.first;
long long dr = p.second;
if (!vizitat[vec]) {
vizitat[vec] = 1;
lungime[vec] = lungime[tata] + dr;
coada.push(vec);
}
}
}
if (!ok) fout << "0\n"; // graful e conex in enunt, deci nu se ajunge aici
return 0;
}