using System.Collections.Generic;
static void Main(String[] args) {
string[] s = Console.ReadLine().Split(' ');
int numNodes = Int32.Parse(s[0]);
int numEdges = Int32.Parse(s[1]);
Node[] nodes = new Node[numNodes + 1];
Edge[] edges = new Edge[numEdges + 1];
bool[] connected = new bool[numNodes + 1];
for (int i = 1; i <= numNodes; i++) {
for (int i = 0; i < numEdges; i++) {
s = Console.ReadLine().Split(' ');
int nodeA = Int32.Parse(s[0]);
int nodeB = Int32.Parse(s[1]);
int weight = Int32.Parse(s[2]);
Edge edge = new Edge(nodes[nodeA], nodes[nodeB], weight);
nodes[nodeA].edges.Add(edge);
nodes[nodeB].edges.Add(edge);
int startNode = Int32.Parse(Console.ReadLine());
HashSet<Edge> edgeOptions = new HashSet<Edge>();
foreach (var edge in nodes[startNode].edges) {
while(edgeOptions.Count > 0) {
var newOptions = new HashSet<Edge>();
int minVal = Int32.MaxValue;
foreach (var option in edgeOptions) {
if (option.weight < minVal) {
if (! (connected[option.nodeA.value] && connected[option.nodeB.value])) {
if (! (connected[option.nodeA.value] && connected[option.nodeB.value])) {
connected[smallest.nodeA.value] = true;
connected[smallest.nodeB.value] = true;
newOptions.Remove(smallest);
foreach (var edge in smallest.nodeA.edges) {
if (connected[edge.nodeA.value] && connected[edge.nodeB.value]) {
foreach (var edge in smallest.nodeB.edges) {
if (connected[edge.nodeA.value] && connected[edge.nodeB.value]) {
edgeOptions = newOptions;
Console.WriteLine(totalWeight);
this.edges = new List<Edge>();
public int value { get; set; }
public List<Edge> edges { get; set; }
public Edge(Node nodeA, Node nodeB, int weight) {
public int weight { get; set; }
public Node nodeA { get; set; }
public Node nodeB { get; set; }