import java.util.*;
import java.io.*;  
import java.util.Map.Entry;
 
public class Solution{
    // public static class pair{
    //     int x;
    //     int y;
    // }
    public static class FastScanner {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer("");
        public String next() {
			while (st == null || !st.hasMoreElements())
				try {
					st=new StringTokenizer(br.readLine());
				} catch (IOException e) {
					e.printStackTrace();
				}
			return st.nextToken();
		}
		public int nextInt() {
			return Integer.parseInt(next());
		}
		public long nextLong() {
			return Long.parseLong(next());
		}
		public int[] readArray(int n) {
			int[] a=new int[n];
			for (int i=0; i<n; i++) {
				a[i]=nextInt();
			}
			return a;
		}
		public double nextDouble() {
			return Double.parseDouble(next());
		}
    }
    public static class Pair implements Comparable<Pair>{
        private int x;
        private int y;
        private int c;
        public Pair(int a,int b,int cost){
            x=a;
            y=b;
            c=cost;
        }
        public Pair clone() {
			return new Pair(x, y,c);
		}
        @Override
		public int compareTo(Pair o) {
			if (x > o.x) {
				return 1;
			}
			if (x < o.x) {
				return -1;
			}
			if (y > o.y) {
				return 1;
			}
			if (y < o.y) {
				return -1;
			}
			if (c > o.c) {
				return 1;
			}
			if (c < o.c) {
				return -1;
			}
			return 0;
		}
    }
    static long[] fac=fact();
    static long[] fact(){
        long[] fac = new long[200001];
        fac[0] = (long)1;
        for (int i = 1; i < (int)fac.length; i++){
            fac[i] = (fac[i - 1] * i) % 1000000007;
        }
        return fac;
    }
    public static int[] p;
    public static int find(int u){
        while(p[u]!=u){
            u=p[u];
        }
        return u;
    }
    public static void union(int u,int v){
        int x=find(u);
        int y=find(v);
        p[x]=y;
    }
    static class Point { int x; int y; public Point(int x, int y) { this.x = x; this.y = y; } }

    public static void main(String[] args) throws IOException{
        FastScanner fs=new FastScanner();
		int t=fs.nextInt();
		PrintWriter out=new PrintWriter(System.out);
		while(t-->0){
		    int n=fs.nextInt();
		    int m=fs.nextInt();
		    int k=fs.nextInt();
		    Pair[] arr=new Pair[m];
		    p=new int[n+1];
		    for(int i=0;i<n+1;i++){
		        p[i]=i;
		    }
		    for(int i=0;i<m;i++){
		        arr[i]=new Pair(fs.nextInt(),fs.nextInt(),fs.nextInt());
		    }
		    int ans=0;
		    Arrays.sort(arr,new Comp());
		  //  for(int i=0;i<m;i++){
		  //      System.out.println(arr[i].x+" "+arr[i].y+" "+arr[i].c);
		  //  }
		    int edge=-1;
		    int index=-1;
		    int x=-1;
		    int y=-1;
		    int rem=n-2;
		    for(int i=0;i<m;i++){
		        int u=arr[i].x;
		        int v=arr[i].y;
		        if(rem==0){
		            break;
		        }
		        if(find(u)==find(v)){
		            
		        }else{
		          //  System.out.println(u+" "+(v));
		            ans+=Math.max(0,arr[i].c-k);
		            edge=arr[i].c;
		            index=i;
		            x=p[u];
		            y=p[v];
		            union(u,v);
		            rem--;
		        }
		    }
		  //  System.out.println(x+" "+y);
		  //  for(int i=0;i<p.length;i++){
		  //      System.out.print(p[i]+" ");
		  //  }
		  //  System.out.println();
		  //  if(edge<k){
		        int diff=Integer.MAX_VALUE;
		      //  p[arr[index].x]=x;
		      //  p[arr[index].y]=y;
		      //  System.out.println(find(arr[index].x)+" "+find(arr[index].y));
		        for(int i=index+1;i<m;i++){
		            int u=arr[i].x;
		            int v=arr[i].y;
		            if(find(u)==find(v)){
		                
		            }else{
		              //  System.out.println(u+" "+(v));
		                diff=Math.min(diff,Math.abs(arr[i].c-k));
		            }
		        }
		        ans+=diff;
		  //  }
		    System.out.println(ans);
		}
        out.close();
    }
    
    public static float area(Point A, Point B, Point C) { float area = (A.x * (B.y - C.y) + B.x * (C.y - A.y) + C.x * (A.y - B.y)) / 2.0f; return Math.abs(area); }

    public static boolean getans(int v,int[] arr,int b,int a){
        int low=Math.min(a,b);
        int high=Math.max(a,b)-2;
        int t=low;
        int ans=0;
        int i=0;
        while(i<arr.length){
            // System.out.println(arr[i]+" "+t);
            if(arr[i]<=t){
                t++;
                ans++;
                i++;
            }else{
                t=arr[i];
            }
            if(t>high){
                break;
            }
        }
        if(ans>=v){
            return true;
        }
        return false;
    }
    public static String call(int in,char[] arr){
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<in;i++){
            sb.append(arr[i]+"");
        }
        sb.append(arr[arr.length-1]+"");
        for(int i=in+1;i<arr.length-1;i++){
            sb.append(arr[i]+"");
        }
        sb.append(arr[in]+"");
        return sb.toString();
    }
    public static int dfs(int in,ArrayList<Integer>[] adj,HashSet<Integer> set,HashMap<Integer,Integer> vis){
        if(vis.containsKey(in)){
            return 1;
        }
        if(set.contains(in)){
            return 0;
        }
        vis.put(in,1);
        ArrayList<Integer> l=adj[in-1];
        if(l.size()==0){
            return 2;
        }
        return dfs(l.get(0),adj,set,vis);
    }
    public static boolean check(long n){
        String s=n+"";
        HashMap<Integer,Integer> set=new HashMap<>();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)!='0'){
                set.put(s.charAt(i)-'0',1);
            }
        }
        for(int key:set.keySet()){
            if(n%key!=0){
                return false;
            }
        }
        return true;
    }
    public static void sort(int[] array){
		ArrayList<Integer> copy = new ArrayList<>();
		for(int i:array){
			copy.add(i);
		}
		Collections.sort(copy);
		for(int i=0;i<array.length;i++){
			array[i]=copy.get(i);
		}
	}
    static long power(long x, long y, long p){
        long res = 1;
        x = x % p;
        while (y > 0) {
            if (y % 2 == 1)
                res = (res * x) % p;
            y = y >> 1; // y = y/2
            x = (x * x) % p;
        }
        return res;
    }
    public static long modInverse(long n, long p){
        return power(n, p - 2, p);
    }
    public static long nCr(long n, long r,long p){
        if (n<r) 
              return (long)0;
        if (r == 0)
            return (long)1;
        return (fac[(int)n] * modInverse(fac[(int)r], p)% p * modInverse(fac[(int)(n - r)], p)% p)% p;
    }
    public static int upp(int[] arr,int v){
        int low=0;
        int high=arr.length-1;
        int ans=-1;
        while(low<=high){
            int m=(low+high)/2;
            if(arr[m]<v){
                ans=m;
                low=m+1;
            }else{
                high=m-1;
            }
        }
        return ans+1;
    }
    public static int low(int[] arr,int v){
        int low=0;
        int high=arr.length-1;
        int ans=-1;
        while(low<=high){
            int m=(low+high)/2;
            if(arr[m]>v){
                ans=m;
                high=m-1;
            }else{
                low=m+1;
            }
        }
        return ans;
    }
    public static class Comp implements Comparator<Pair>{
        public int compare(Pair a,Pair b){
            return a.c-b.c;
        }
    }
    public static int gcd(int a,int b){
        if (b == 0) 
        return a; 
        return gcd(b, a % b);
    }
    public static int lcm(int a,int b){
        int x=Math.max(a,b);
        int y=Math.min(a,b);
        long ans=x;
        while(ans%y!=0){
            ans+=x;
        }
        if(ans>Integer.MAX_VALUE){
            return -1;
        }
        return (int)ans;
    }
    public static long fact(int n){
        long ans=1;
        for(int i=1;i<=n;i++){
            ans*=i;
        }
        return ans;
    }
}