//
// Created by Irina Manea on 09.11.2026.
//#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;
ifstream f("sate.in");
ofstream g("sate.out");
int n, m, x, y;
vector<vector<pair<int, int>>> lista;
vector<bool> viz;
vector<int> d;
void citire() {
f >> n >> m >> x >> y;
lista.resize(n + 1);
for (int i = 0; i < m; i++) {
int u, v, dist;
f >> u >> v >> dist;
lista[u].push_back({v, dist});
lista[v].push_back({u, -dist});
}
}
void bfs(int start) {
viz.assign(n + 1, false);
d.assign(n + 1, 0);
queue<int> coada;
coada.push(start);
viz[start] = true;
d[start] = 0;
while (!coada.empty()) {
int nod = coada.front();
coada.pop();
if (nod == y) {
break;
}
for (int i = 0; i < lista[nod].size(); i++) {
int vecin = lista[nod][i].first;
int cost = lista[nod][i].second;
if (!viz[vecin]) {
viz[vecin] = true;
d[vecin] = d[nod] + cost;
coada.push(vecin);
}
}
}
}
int main() {
citire();
bfs(x);
g << abs(d[y] - d[x]) << "\n"; // abs ca sa fie mereu poz
return 0;
}