int mst_kruskal(graph *g, edge *elist, double (*cost)(graph *g, edge e))
{
  edge *edges;
  edge e; 
  int  k; 

  edges = (edge *) malloc(sizeof(edge) * number_of_edges(g));
  k = 0; 
  forall_edges(e,g) {
    edges[k++] = e;
  }
  
  for (k=0; k<number_of_edges(g); k++) {
    if (k % 6 == 0) 
      printf("\n");
    printf("%f ", get_distance(g,edges[k]));
  }
  printf("\n");
  return 0; 

}
	}

	std::vector<NodeID> sources(G.number_of_edges(), 0);
	std::vector<NodeID> targets(G.number_of_edges(), 0);
	forall_nodes(G, node) {
		forall_out_edges(G, e, node) {
			NodeID target = G.getEdgeTarget(e);
			sources[e] = node;
			targets[e] = target;
		} endfor
	} endfor


	//now find two random leafes 
	NodeID v_1, v_2;
	unsigned r_idx = random_functions::nextInt(0, G.number_of_edges()-1);
	while(true) {
		NodeID source = sources[r_idx];
		NodeID target = targets[r_idx];
		if( parent[source] != target && parent[target] != source) {
			//found a non-tree edge
			v_1 = source;
			v_2 = target;
			break;
		} 

		r_idx = random_functions::nextInt(0, G.number_of_edges()-1);
	}

	// NodeID now climb up the parent array step wise left and right
	std::vector<NodeID> lhs_path, rhs_path;