#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#ifndef INF
#define INF 1e9
#endif
std::ifstream f("sate.in");
std::ofstream g("sate.out");
std::vector<std::vector<std::pair<int, long>>> adj; // lista de adiacenta, {vecin,distanta}
std::vector<int> dist; //distanta de la nodul X la oricare nod
void BFS(int start,int dest) {
std::queue<int> q;
q.push(start);
dist[start] = 0;
while (!q.empty()) {
int nod = q.front();
q.pop(); // extragem primul elem
for (std::pair<int,long> vec_dist : adj[nod]) {
int v = vec_dist.first;
long d = vec_dist.second;
if (dist[v] == INF) {
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,INF);
for (int i = 1; i <= n; i++) {
int a,b;
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;
}