#include <iostream>
#include <bits/stdc++.h>
#include <bitset>
#include <algorithm>
#include <tuple>
using namespace std;
const int MAXN=200000;
int parent[MAXN];
int si[MAXN];
int findParent(int a)
{
    if(parent[a]==a)return a;
    parent[a]=findParent(parent[a]);
    return parent[a];
}
bool connected(int x,int y)
{
    if(findParent(x)==findParent(y))return true;
    return false;
}
void connect(int x,int y)
{
    if(si[findParent(x)]>si[findParent(y)])swap(x,y);
    parent[findParent(x)]=findParent(y);
    si[findParent(y)]+=si[findParent(x)];
}
int main()
{
    int t;
    cin>>t;
    for(int u=0;u<t;u++)
    {
        int n,m;
        long long k;
        cin>>n>>m>>k;
        vector<tuple<long long,int,int>>edge;
        long best=LONG_MAX;
        for(int i=0;i<m;i++)
        {
            int x,y;
            long long s;
            cin>>x>>y>>s;
            if(abs(k-s)<best)best=abs(k-s);
            edge.push_back(make_tuple(s,x-1,y-1));
        }
        sort(edge.begin(),edge.end());
        for(int i=0;i<n;i++)parent[i]=i;
        for(int i=0;i<n;i++)si[i]=0;
        bool small=true;
        long long output=0;
        for(tuple<long long,int,int>i:edge)
        {
            int b,c;
            long long a;
            a=get<0>(i);
            b=get<1>(i);
            c=get<2>(i);
            if(!connected(b,c))
            {
                if(a>k)
                {
                    small=false;
                    output+=a-k;
                }
                connect(b,c);
            }
        }
        if(small)cout<<best<<"\n";
        else cout<<output<<"\n";
    }
}
