#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define M 1000000007
#define MAXN 100005
#define INF (1ll<<30)
#define NAME "TAITRONG"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
struct edge {
ll u, v, w;
};
ll n, m, s, t;
vector<edge> edges;
ll lab[MAXN];
ll find_set(ll v) {
if (lab[v] < 0) return v;
return lab[v] = find_set(lab[v]);
}
bool union_sets(ll a, ll b) {
a = find_set(a);
b = find_set(b);
if(a == b ) return false ;
if (lab[a] > lab[b]) swap(a, b);
lab[a] += lab[b];
lab[b] = a;
return true ;
}
bool check(ll val) {
FOR(i, 1, n) lab[i] = -1;
for (auto e : edges) {
if (e.w >= val) {
union_sets(e.u, e.v);
}
}
return find_set(s) == find_set(t);
}
void init() {
cin >> n >> m >> s >> t ;
REP(i, m) {
ll u, v, w;
cin >> u >> v >> w;
edges.push_back({u, v, w});
}
}
void solve() {
ll l = 1, r = 10000, ans = 0;
while(l <= r) {
ll mid = (l + r) / 2;
if (check(mid)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
cout << ans << el;
}
_ROOT_ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while(t--) {
init();
solve();
}
return (0&0);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGNvbXBhcmUodikgc29ydCgodikuYmVnaW4oKSwgKHYpLmVuZCgpKTsgKHYpLmVyYXNlKHVuaXF1ZSgodikuYmVnaW4oKSwgKHYpLmVuZCgpKSwgKHYpLmVuZCgpKTsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBfUk9PVF8gaW50IG1haW4oKQojZGVmaW5lIE0gMTAwMDAwMDAwNwojZGVmaW5lIE1BWE4gMTAwMDA1CiNkZWZpbmUgSU5GICgxbGw8PDMwKQojZGVmaW5lIE5BTUUgIlRBSVRST05HIgojZGVmaW5lIGRlYnVnKGEpIGNvdXQgPDwgI2EgPDwgIiA9ICIgPDwgYSA8PCBlbmRsOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGVkZ2UgewogICAgbGwgdSwgdiwgdzsKfTsKCmxsIG4sIG0sIHMsIHQ7CnZlY3RvcjxlZGdlPiBlZGdlczsKbGwgbGFiW01BWE5dOwoKbGwgZmluZF9zZXQobGwgdikgewogICAgaWYgKGxhYlt2XSA8IDApIHJldHVybiB2OwogICAgcmV0dXJuIGxhYlt2XSA9IGZpbmRfc2V0KGxhYlt2XSk7Cn0KCmJvb2wgdW5pb25fc2V0cyhsbCBhLCBsbCBiKSB7CiAgICBhID0gZmluZF9zZXQoYSk7CiAgICBiID0gZmluZF9zZXQoYik7CiAgICBpZihhID09IGIgKSByZXR1cm4gZmFsc2UgOwogICAgaWYgKGxhYlthXSA+IGxhYltiXSkgc3dhcChhLCBiKTsKICAgIGxhYlthXSArPSBsYWJbYl07CiAgICBsYWJbYl0gPSBhOwogICAgcmV0dXJuIHRydWUgOwp9Cgpib29sIGNoZWNrKGxsIHZhbCkgewoKICAgIEZPUihpLCAxLCBuKSBsYWJbaV0gPSAtMTsKCiAgICBmb3IgKGF1dG8gZSA6IGVkZ2VzKSB7CiAgICAgICAgaWYgKGUudyA+PSB2YWwpIHsKICAgICAgICAgICAgdW5pb25fc2V0cyhlLnUsIGUudik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpbmRfc2V0KHMpID09IGZpbmRfc2V0KHQpOwp9Cgp2b2lkIGluaXQoKSB7CiAgICBjaW4gPj4gbiA+PiBtID4+IHMgPj4gdCA7CiAgICBSRVAoaSwgbSkgewogICAgICAgIGxsIHUsIHYsIHc7CiAgICAgICAgY2luID4+IHUgPj4gdiA+PiB3OwogICAgICAgIGVkZ2VzLnB1c2hfYmFjayh7dSwgdiwgd30pOwogICAgfQp9Cgp2b2lkIHNvbHZlKCkgewogICAgbGwgbCA9IDEsIHIgPSAxMDAwMCwgYW5zID0gMDsKICAgIHdoaWxlKGwgPD0gcikgewogICAgICAgIGxsIG1pZCA9IChsICsgcikgLyAyOwogICAgICAgIGlmIChjaGVjayhtaWQpKSB7CiAgICAgICAgICAgIGFucyA9IG1pZDsKICAgICAgICAgICAgbCA9IG1pZCArIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgciA9IG1pZCAtIDE7CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCBhbnMgPDwgZWw7Cn0KCl9ST09UXyB7CiAgICAvLyBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7CiAgICAvLyBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CiAgICBjb3V0LnRpZSgwKTsKICAgIGludCB0ID0gMTsKICAgIC8vIGNpbiA+PiB0OwogICAgd2hpbGUodC0tKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gKDAmMCk7Cn0K