#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
struct Muchie {
int nod;
int distanta;
};
const int MAXN = 30005;
vector<Muchie> graf[MAXN];
int distante[MAXN];
bool vizitat[MAXN];
int main() {
ifstream f("sate.in");
ofstream g("sate.out");
int n, m, x, y;
f >> n >> m >> x >> y;
for (int i = 1; i <= m; ++i) {
int u, v, d;
f >> u >> v >> d;
Muchie m1;
m1.nod = v;
m1.distanta = d;
graf[u].push_back(m1);
Muchie m2;
m2.nod = u;
m2.distanta = -d;
graf[v].push_back(m2);
}
queue<int> coada;
coada.push(x);
vizitat[x] = true;
distante[x] = 0;
// BFS
while (!coada.empty()) {
int nod_curent = coada.front();
coada.pop();
if (nod_curent == y) {
break;
}
for (Muchie vecin_curent : graf[nod_curent]) {
int vecin = vecin_curent.nod;
int cost = vecin_curent.distanta;
if (vizitat[vecin] == false) {
vizitat[vecin] = true;
distante[vecin] = distante[nod_curent] + cost;
coada.push(vecin);
}
}
}
int rezultat = distante[y];
if (rezultat < 0) {
rezultat = -rezultat;
}
g << rezultat << "\n";
f.close();
g.close();
return 0;
}