using System.Collections.Generic;
static void Main(String[] args)
var cases = int.Parse(Console.ReadLine());
for (int i = 0; i < cases; i++)
var str = Console.ReadLine();
var tokens = str.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
var n = int.Parse(tokens[0]);
var m = int.Parse(tokens[1]);
List<List<Edge<int>>> graphAdj = new List<List<Edge<int>>>();
for (int j = 0; j < numEdges; j++)
str = Console.ReadLine();
tokens = str.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
var v1 = int.Parse(tokens[0]);
var v2 = int.Parse(tokens[1]);
var d = int.Parse(tokens[2]);
int maxV = Math.Max(v1, v2);
while (graphAdj.Count < maxV)
var list = new List<Edge<int>>();
int x = v1 - 1, y = v2 - 1;
var e = new Edge<int>(x, y, d);
foreach (var subset in GetSubsets(n, 3))
var subGraph = CreateSubGraph(graphAdj, subset);
var cost = GetMinimumSpanningTree(subGraph);
private static Graph<int> CreateSubGraph(List<List<Edge<int>>> graph, List<int> vertexSet)
Graph<int> g = new Graph<int>();
foreach (var v in vertexSet)
var neighbors = graph[v];
foreach (var edge in neighbors)
if (vertexSet.Contains(edge.Source) && vertexSet.Contains(edge.Destination))
if (!g.Edges.Contains(edge))
if (!g.Vertices.Contains(edge.Source))
g.Vertices.Add(edge.Source);
if (!g.Vertices.Contains(edge.Destination))
g.Vertices.Add(edge.Destination);
private static IEnumerable<List<int>> GetSubsets(int n, int numElems)
double rows = Math.Pow(2, n);
for (int counter = 0; counter < rows; counter++)
var subset = new List<int>();
for (var bit = 0; bit < n; bit++)
var signal = counter & (1 << bit);
if (subset.Count == numElems) { subset.Clear(); break; }
if (subset.Count == numElems)
private static int GetMinimumSpanningTree(Graph<int> graph)
var result = KruskalMST(graph);
foreach (var e in result)
private static List<Edge<int>> KruskalMST(Graph<int> graph)
int numVert = graph.NumVertices;
List<Edge<int>> result = new List<Edge<int>>();
var edges = new List<Edge<int>>();
foreach (var edge in graph.Edges)
var subsets = new Dictionary<int, Subset>();
foreach (int v in graph.Vertices)
subsets.Add(v, new Subset(v, 0));
while (result.Count < (numVert - 1))
var nextEdge = edges[i++];
int x = Find(subsets, nextEdge.Source);
int y = Find(subsets, nextEdge.Destination);
private static int Find(Dictionary<int, Subset> subsets, int i)
if (subsets[i].Parent != i)
subsets[i].Parent = Find(subsets, subsets[i].Parent);
return subsets[i].Parent;
private static void Union(Dictionary<int, Subset> subsets, int x, int y)
int xroot = Find(subsets, x);
int yroot = Find(subsets, y);
if (subsets[xroot].Rank < subsets[yroot].Rank)
subsets[xroot].Parent = yroot;
else if (subsets[xroot].Rank > subsets[yroot].Rank)
subsets[yroot].Parent = xroot;
subsets[yroot].Parent = xroot;
public TreeNode(T val) { this.Value = val; }
public int NumVertices { get { return this.Vertices.Count; } }
public int NumEdges { get { return this.Edges.Count; } }
public HashSet<Edge<T>> Edges = new HashSet<Edge<T>>();
public HashSet<T> Vertices = new HashSet<T>();
public Subset(int parent, int rank) { this.Parent = parent; this.Rank = rank; }
public class Edge<T> : IComparable<Edge<T>>
public Edge(T v1, T v2, int weight)
public int CompareTo(Edge<T> other)
return Convert.ToInt32(this.Weight).CompareTo(Convert.ToInt32(other.Weight));