#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
const int NMAX = 30005;
int n, m, x, y;
// vecin[a][k] = al k-lea sat legat direct de satul a
// deplasare[a][k] = cu cat ma mut daca merg din a in vecin[a][k]
// (pozitiv spre dreapta, negativ spre stanga)
vector<int> vecin[NMAX];
vector<int> deplasare[NMAX];
int pozitie[NMAX]; // pozitia fiecarui sat fata de X (X are pozitia 0)
bool vizitat[NMAX];
void bfs(int start) {
queue<int> coada;
coada.push(start);
vizitat[start] = true;
pozitie[start] = 0;
while (!coada.empty()) {
int sat = coada.front();
coada.pop();
for (int k = 0; k < vecin[sat].size(); k++) {
int urmator = vecin[sat][k];
if (!vizitat[urmator]) {
vizitat[urmator] = true;
pozitie[urmator] = pozitie[sat] + deplasare[sat][k];
coada.push(urmator);
}
}
}
}
int main() {
fin >> n >> m >> x >> y;
for (int k = 0; k < m; k++) {
int i, j, d;
fin >> i >> j >> d;
vecin[i].push_back(j); deplasare[i].push_back(d); // din i in j: d km spre dreapta
vecin[j].push_back(i); deplasare[j].push_back(-d); // din j in i: d km spre stanga
}
bfs(x);
int distanta = pozitie[y];
if (distanta < 0)
distanta = -distanta;
fout << distanta;
return 0;
}