#include <iostream>
#include <vector>
#include <queue>
#include <limits>
const int INF = std::numeric_limits<int>::max();
struct Edge {
int destination;
int weight;
};
// Hàm tìm tải trọng lớn nhất trên đường đi từ thành phố s đến thành phố t
int findMaxLoad(const std::vector<std::vector<Edge>>& graph, int n, int s, int t) {
std::vector<int> maxLoad(n + 1, 0);
std::priority_queue<std::pair<int, int>> pq;
maxLoad[s] = INF;
pq.push({INF, s});
while (!pq.empty()) {
int load = pq.top().first;
int currentCity = pq.top().second;
pq.pop();
if (currentCity == t) {
return load;
}
if (load <= maxLoad[currentCity]) {
for (const Edge& edge : graph[currentCity]) {
int newLoad = std::min(load, edge.weight);
if (newLoad > maxLoad[edge.destination]) {
maxLoad[edge.destination] = newLoad;
pq.push({newLoad, edge.destination});
}
}
}
}
return 0;
}
int main() {
int n, m, s, t;
std::cin >> n >> m >> s >> t;
std::vector<std::vector<Edge>> graph(n + 1);
for (int i = 0; i < m; i++) {
int x, y, z;
std::cin >> x >> y >> z;
graph[x].push_back({y, z});
graph[y].push_back({x, z});
}
int maxLoad = findMaxLoad(graph, n, s, t);
std::cout << maxLoad << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxsaW1pdHM+Cgpjb25zdCBpbnQgSU5GID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKCnN0cnVjdCBFZGdlIHsKICAgIGludCBkZXN0aW5hdGlvbjsKICAgIGludCB3ZWlnaHQ7Cn07CgovLyBIw6BtIHTDrG0gdOG6o2kgdHLhu41uZyBs4bubbiBuaOG6pXQgdHLDqm4gxJHGsOG7nW5nIMSRaSB04burIHRow6BuaCBwaOG7kSBzIMSR4bq/biB0aMOgbmggcGjhu5EgdAppbnQgZmluZE1heExvYWQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8RWRnZT4+JiBncmFwaCwgaW50IG4sIGludCBzLCBpbnQgdCkgewogICAgc3RkOjp2ZWN0b3I8aW50PiBtYXhMb2FkKG4gKyAxLCAwKTsKICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8c3RkOjpwYWlyPGludCwgaW50Pj4gcHE7CgogICAgbWF4TG9hZFtzXSA9IElORjsKICAgIHBxLnB1c2goe0lORiwgc30pOwoKICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgIGludCBsb2FkID0gcHEudG9wKCkuZmlyc3Q7CiAgICAgICAgaW50IGN1cnJlbnRDaXR5ID0gcHEudG9wKCkuc2Vjb25kOwogICAgICAgIHBxLnBvcCgpOwoKICAgICAgICBpZiAoY3VycmVudENpdHkgPT0gdCkgewogICAgICAgICAgICByZXR1cm4gbG9hZDsKICAgICAgICB9CgogICAgICAgIGlmIChsb2FkIDw9IG1heExvYWRbY3VycmVudENpdHldKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgRWRnZSYgZWRnZSA6IGdyYXBoW2N1cnJlbnRDaXR5XSkgewogICAgICAgICAgICAgICAgaW50IG5ld0xvYWQgPSBzdGQ6Om1pbihsb2FkLCBlZGdlLndlaWdodCk7CiAgICAgICAgICAgICAgICBpZiAobmV3TG9hZCA+IG1heExvYWRbZWRnZS5kZXN0aW5hdGlvbl0pIHsKICAgICAgICAgICAgICAgICAgICBtYXhMb2FkW2VkZ2UuZGVzdGluYXRpb25dID0gbmV3TG9hZDsKICAgICAgICAgICAgICAgICAgICBwcS5wdXNoKHtuZXdMb2FkLCBlZGdlLmRlc3RpbmF0aW9ufSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkgewogICAgaW50IG4sIG0sIHMsIHQ7CiAgICBzdGQ6OmNpbiA+PiBuID4+IG0gPj4gcyA+PiB0OwoKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEVkZ2U+PiBncmFwaChuICsgMSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBpbnQgeCwgeSwgejsKICAgICAgICBzdGQ6OmNpbiA+PiB4ID4+IHkgPj4gejsKICAgICAgICBncmFwaFt4XS5wdXNoX2JhY2soe3ksIHp9KTsKICAgICAgICBncmFwaFt5XS5wdXNoX2JhY2soe3gsIHp9KTsKICAgIH0KCiAgICBpbnQgbWF4TG9hZCA9IGZpbmRNYXhMb2FkKGdyYXBoLCBuLCBzLCB0KTsKCiAgICBzdGQ6OmNvdXQgPDwgbWF4TG9hZCA8PCBzdGQ6OmVuZGw7CgogICAgcmV0dXJuIDA7Cn0=