/*
Am reprezentat graful folosind liste de adiacență, memorând pentru fiecare muchie distanța dintre cele două sate.
Am atribuit muchiilor sensuri opuse valori cu semne contrare, pentru a putea calcula distanța în ambele direcții.
Am aplicat DFS pornind din satul X, calculând pentru fiecare sat accesibil distanța față de X cu ajutorul vectorului distanta.
La final, am afișat distanța până la satul Y.
Complexitate: O(N + M)
*/
#include <vector>
#include <utility>
#include <fstream>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
bool vizitat[30001];
int distanta[30001];
vector<pair<int, int>> graf[30001];
void DFS(int nod) {
vizitat[nod]=true;
for (auto vecin : graf[nod]) {
if (!vizitat[vecin.first]) {
distanta[vecin.first]=distanta[nod] + vecin.second;
DFS(vecin.first);
}
}
}
int main() {
int N, M, X, Y ,i,j, d;
fin>> N>> M>> X>>Y;
for (int c=1; c<=M; c++) {
fin>>i>>j>>d;
graf[i].push_back({j,d});
graf[j].push_back({i,-d});
}
distanta[X]=0;
DFS(X);
fout<<distanta[Y];
fin.close();
fout.close();
}