#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;
}