#include <fstream>
#include <vector>
#include <queue>
std::ifstream fin("sate.in");
std::ofstream fout("sate.out");
struct vecinDist {
int vecin, distanta;
};
int main() {
int n, m, x, y;
std::queue<int> queue;
fin >> n >> m >> x >> y;
std::vector<std::vector<vecinDist>> graph(n+1);
std::vector<int> distances(n+1, 0);
std::vector<int> visited(n+1, 0);
int nodeBegin, nodeReach, distance;
while (m > 0) {
fin >> nodeBegin >> nodeReach >> distance;
graph[nodeBegin].push_back(vecinDist{nodeReach, distance});
graph[nodeReach].push_back((vecinDist{nodeBegin, distance}));
m--;
}
queue.push(x);
distances[x] = 0;
visited[x] = 1;
while (!queue.empty()) {
int crt = queue.front();
queue.pop();
for (auto p : graph[crt]) {
if (visited[p.vecin] == 0) {
visited[p.vecin] = 1;
queue.push(p.vecin);
if (p.vecin > crt) {
distances[p.vecin] = distances[crt] + p.distanta;
}
else if (p.vecin < crt) {
distances[p.vecin] = distances[crt] - p.distanta;
}
}
}
}
if (distances[y] != 0)
fout << std::abs(distances[y]);
}