// bibliotecile necesare
#include<iostream>
#include<vector>
#include<queue>
#include<fstream>
#include<cstdlib>
using namespace std;
// fisierele pe care le folosim
ifstream fin("sate.in");
ofstream fout("sate.out");
// aici declar graful
vector<pair<int, int>> graf[30001]; // vecinii fiecarui sat si dist sub forma de perechi
bool vizitat[30001] = {}; // o variablia sa stiu daca am vizitat sau nu un nod
int dist[30001] = {}; // si distanta relativa fata de satul x
int main() {
// introduc datele din fisier si construiesc graful
int n, m, x, y;
fin >> n >> m >> x >> y;
for(int i = 0; i < m; i++){
int a, b, d;
fin >> a >> b >> d;
graf[a].push_back({b, d});
graf[b].push_back({a, d});
}
// ma folosesc de o coada
queue<int> q;
q.push(x); // introduc primul nod in coada
vizitat[x] = true; // il delcar vizitat
dist[x] = 0; // si pentru moment distanta e 0
// cat timp mai am ceva de citit din coada
while(!q.empty()){
int nod = q.front(); // ma folosesc de o variabila nod in care pun primul element
q.pop(); // si il si scot
// cout << nod << " "; nu e necesar dar se observa modul in care parcurge bfs ul graful
for(auto p : graf[nod]){ // parcurg lista de adiacenta
int vecin = p.first; // primul element din pereche e vecinul
int d = p.second; // al doilea este distanta fata de vecin
if(!vizitat[vecin]){ // daca nu l am mai vizitat
vizitat[vecin] = true;
if(vecin > nod) // daca e la dreapta
dist[vecin] = dist[nod] + d; // adaug d la distanta
else // daca e la stanga
dist[vecin] = dist[nod] - d; // scad d la distanta
q.push(vecin); // il punem si pe el in coada
}
}
}
fout << abs(dist[y]) << '\n'; // afisam modulul, daca am avea un caz de distanta de la 10 la 1
return 0;
}