#include <bits/stdc++.h> using namespace std; using i64 = long long; struct E { int u, v; i64 w; }; struct DSU { vector<int> p, r; DSU(int n = 0) { init(n); } void init(int n) { p.resize(n + 1); r.assign(n + 1, 0); iota(p.begin(), p.end(), 0); } int f(int x) { return p[x] == x ? x : p[x] = f(p[x]); } bool uni(int a, int b) { a = f(a); b = f(b); if (a == b) return false; if (r[a] < r[b]) swap(a, b); p[b] = a; if (r[a] == r[b]) r[a]++; return true; } }; int main() { int n, m; i64 k; cin >> n >> m >> k; vector<E> e(m); i64 mx = 0; for (int i = 0; i < m; ++i) { int a, b; i64 c; cin >> a >> b >> c; e[i] = {a, b, c}; mx = max(mx, c); } // 只排序一次:按原权降序 sort(e.begin(), e.end(), [](const E & A, const E & B) { return A.w > B.w; }); auto ok = [&](i64 X) -> bool { DSU d(n); i64 need = 0; int cnt = 0; for (const auto& ed : e) { if (d.uni(ed.u, ed.v)) { ++cnt; if (ed.w < X) { need += (X - ed.w); if (need > k) return false; // 剪枝 } if (cnt == n - 1) break; } } return cnt == n - 1 && need <= k; }; // 二分“生成树中的最小边权”的最大可达值 i64 L = 0, R = mx + k; // 上界安全 while (L < R) { i64 mid = (L + R + 1) >> 1; if (ok(mid)) L = mid; else R = mid - 1; } cout << L << '\n'; return 0; }