#include <fstream>
#include <queue>
#include <vector>
std::ifstream cin("sate.in");
std::ofstream cout("sate.out");
int n, m;
struct nod {
int dest, cost;
bool operator < (const nod & other) const {
return this->cost < other.cost;
}
};
std::vector<nod> G[30001];
int start, finish;
int d[30001];
void dijkstra() {
for(int i = 1; i <= n; ++i) {
d[i] = 2e9;
}
d[start] = 0;
std::priority_queue<nod> pq;
pq.push({start, 0});
while(!pq.empty()) {
auto node = pq.top();
pq.pop();
if(node.cost > d[node.dest]) continue;
for(auto nodnou : G[node.dest]) {
if(d[node.dest] + nodnou.cost < d[nodnou.dest]) {
d[nodnou.dest] = d[node.dest] + nodnou.cost;
pq.push({nodnou.dest, d[nodnou.dest]});
}
}
}
}
int main() {
cin >> n >> m >> start >> finish;
for(int i = 0; i < m; ++i) {
int src, dest, cost;
cin >> src >> dest >> cost;
G[src].push_back({dest, cost});
G[dest].push_back({src, -cost});
}
dijkstra();
cout << d[finish] << '\n';
return 0;
}