/*
Author: Ritik Patel
*/

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& LIBRARIES &&&&&&&&&&&&&&&&&&&&&&&&&&&
 
#include <bits/stdc++.h>
using namespace std;
 
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DEFINES &&&&&&&&&&&&&&&&&&&&&&&&&&&

#define int long long int
// #define ll long long int
#define all(i) i.begin(), i.end()
#define SZ(a) (int)a.size()
 
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CODE &&&&&&&&&&&&&&&&&&&&&&&&&&&

struct DSU {

    vector<int> par, sze;
    int connected;

    void init(int n) {
        par.resize(n + 1), sze.resize(n + 1);
        for(int i = 1; i <= n; ++i) 
            par[i] = i, sze[i] = 1;
        connected = n;
    }

    int get_par(int x) {
        if(x == par[x]) return x;
        return par[x] = get_par(par[x]);
    }

    void merge(int u, int v) {
        if( (u = par[u]) != (v = par[v])) {
            connected--;
            if(sze[u] < sze[v]) {
                swap(u, v);
            }
            sze[u] += sze[v]; sze[v] = 0;
            par[v] = par[u];
        }
    }   
};

void solve() {
    int N, M, K;
    cin >> N >> M >> K;

    vector<tuple<int, int, int>> e(M);
    for (int i = 0; i < M; ++i) {
        int x, y, z;
        cin >> x >> y >> z;
        e[i] = {z, x, y};
    }

    sort(all(e));
    DSU dsu;
    dsu.init(N);
    int ans = 0;
    for (int i = 0; i < M; ++i) {
        auto [cost, x, y] = e[i];
        if (dsu.get_par(x) == dsu.get_par(y)) {
            continue;
        }
        dsu.merge(x, y);
        ans += max(0LL, cost - K);
    }
    if (ans == 0) {
        ans = (int)2e9;
        for (int i = 0; i < M; ++i) {
            ans = min(ans, abs(get<0>(e[i]) - K));
        }
    }

    cout << ans << '\n';
}

int32_t main(){
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout); 
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int T = 1; 
    cin >> T;
    for(int i = 1; i <= T; ++i){
        // cout << "Case #" << i << ": ";
        solve();
    }
    return 0;
}
 
/*
Sample inp
*/