Code:
#include <iostream>
using namespace std;
namespace cmp {
template<typename _Tp> inline _Tp min(const _Tp& a, const _Tp& b) { return a < b ? a : b; }
template<typename _Tp> inline _Tp max(const _Tp& a, const _Tp& b) { return a > b ? a : b; }
}
struct edge { int u, v, w, nxt; } e[40004];
struct node { int fstedge = -1, ans = 0x3fffffff; bool vis = 0; } nd[10004];
int n, m, s, t, u, v, w;
void addedge(int u, int v, int w, int i) {
if (nd[u].fstedge == -1) nd[u].fstedge = i;
e[i] = (edge){u, v, w, nd[u].fstedge};
nd[u].fstedge = i;
}
int dfs(int u, int v) {
//**/printf("in function dfs(u = %d): \n", u);
if (u == v) return 0;
if (nd[u].vis) return nd[u].ans;
nd[u].vis = 1;
int i = nd[u].fstedge;
while (true) {
nd[u].ans = cmp::min(nd[u].ans, cmp::max(e[i].w, dfs(e[i].v, v)));
// printf(" update nd[%d].ans = %d after dfs(%d); \n", u, nd[u].ans, e[i].v);
if (e[i].nxt == i) break;
else i = e[i].nxt;
}
//**/printf(" function dfs(u = %d) return value %d; \n", u, nd[u].ans);
return nd[u].ans;
}
int main() {
cin >> n >> m >> s >> t;
while (m--) {
cin >> u >> v >> w;
addedge(u, v, w, m << 1);
addedge(v, u, w, (m << 1) | 1);
}
// for (int i = 1; i <= n; ++i) {
// int j = nd[i].fstedge;
// while (true) {
// printf("e[%d] = %d %d %d %d\n", j, e[j].u, e[j].v, e[j].w, e[j].nxt);
// if (e[j].nxt == j) break;
// else j = e[j].nxt;
// }
// }
cout << dfs(s, t);
return 0;
}