#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
std::ifstream f("sate.in");
std::ofstream g("sate.out");
std::vector<std::vector<std::pair<int, long long>>> adj; // lista de adiacenta, {vecin,distanta}
std::vector<long long> dist; //distanta de la nodul X la oricare nod
std::vector<bool> viz;
void BFS(int start,int dest) {
std::queue<int> q;
q.push(start);
viz[start] = true;
while (!q.empty()) {
int nod = q.front();
q.pop(); // extragem primul elem
for (auto vec_dist : adj[nod]) {
int v = vec_dist.first;
long long d = vec_dist.second;
if (!viz[v]) {
viz[v] = true;
q.push(v);
dist[v] = dist[nod] + d; // daca nodul e dupa,adaugam distanta,altfel scadem
}
}
}
}
int main() {
int n, m, x, y;
f >> n >> m >> x >> y;
adj.resize(n + 1);
dist.resize(n + 1);
viz.resize(n + 1);
for (int i = 1; i <= m; i++) {
int a,b;
long long c;
f >> a >> b >> c;
adj[a].emplace_back(b,c);
adj[b].emplace_back(a,-c);
}
if (x == y) // cazul in care start == dest
g << 0;
else {
BFS(x,y);
g << abs(dist[y]); // distanta de la x la y
}
return 0;
}