// sate
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 30005;
// Graful va reține perechi de tipul {vecin, cost_muchie}
vector<pair<int, int>> adj[MAXN];
bool vizitat[MAXN];
int dist[MAXN];
int main() {
ifstream fin("sate.in");
ofstream fout("sate.out");
int N, M, X, Y;
fin >> N >> M >> X >> Y;
for (int k = 0; k < M; ++k) {
int u, v, d;
fin >> u >> v >> d;
// Adăugăm muchia directă (cost pozitiv)
adj[u].push_back({v, d});
// Adăugăm muchia inversă (cost negativ)
adj[v].push_back({u, -d});
}
// Parcurgere BFS plecând din X
queue<int> q;
q.push(X);
vizitat[X] = true;
dist[X] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
// Dacă am ajuns la satul căutat, ne putem opri
if (u == Y) {
break;
}
for (auto muchie : adj[u]) {
int v = muchie.first;
int cost = muchie.second;
if (!vizitat[v]) {
vizitat[v] = true;
dist[v] = dist[u] + cost;
q.push(v);
}
}
}
fout << dist[Y] << "\n";
return 0;
}
// alice 2