#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const int N_MAX = 30005;
vector<pair<int, int>> graf[N_MAX]; // vecin,cost
int dist[N_MAX]; // distanta relativa a fiecarui sat fata de satul de start x
bool viz[N_MAX]; // stare de vizitare sat, evit cicluri
int main() {
ifstream fin("sate.in");
ofstream fout("sate.out");
int n, m, x, y;
fin >> n >> m >> x >> y;
for (int i = 0; i < m; ++i) {
int st, dr, d;
fin >> st >> dr >> d;
// muchie spre dreapta cu cost pozitiv
graf[st].push_back(make_pair(dr, d));
// muchie spre stanga cu cost negativ
graf[dr].push_back(make_pair(st, -d));
}
queue<int> coada;
// start sat x care e si originea(dist =0
coada.push(x);
viz[x] = true;
dist[x] = 0;
// BFS
while (!coada.empty()) {
int nod = coada.front();
coada.pop();
if (nod == y) {
break; //am gasit satu
}
for (int i = 0; i < graf[nod].size(); ++i) {
int v = graf[nod][i].first; // satul vecin
int c = graf[nod][i].second; // costul muchiei
// daca nu am mai calculat distanta pentru acest vecin
if (!viz[v]) {
viz[v] = true;
// actualizam distanta fata de x
dist[v] = dist[nod] + c;
// adaugam vecinul in coada pentru a i se explora vecinii mai departe
coada.push(v);
}
}
}
fout << abs(dist[y]) << "\n";
return 0;
}