import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int[] set;
private static void init(int n) {
set = new int[n];
for (int i = 0; i < n; i++) {
set[i] = i;
}
}
private static int group(int n) {
if(set[n] == n) return set[n];
return set[n] = group(set[n]);
}
private static void join(int a, int b) {
int A = group(a);
int B = group(b);
if(A!=B) {
set[A] = B;
}
}
private static boolean connector(int a, int b) {
int A = group(a);
int B = group(b);
return A == B;
}
static class Edge implements Comparable<Edge> {
int a;
int b;
int w;
public Edge(int a, int b, int w) {
this.a = a;
this.b = b;
this.w = w;
}
@Override
public int compareTo(Edge o) {
if(this.w == o.w) {
if(this.a == o.a) return this.b - o.b;
return this.a - o.a;
}
return this.w - o.w;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Edge[] edge = new Edge[M];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
edge[i] = new Edge(a, b, w);
}
Arrays.sort(edge);
int maxlen = -1;
ArrayList<Edge> arr = new ArrayList();
init(N+1);
int eNum = 0;
for (int i = 0; i < M; i++) {
if(!connector(edge[i].a, edge[i].b)) {
eNum++;
join(edge[i].a, edge[i].b);
arr.add(edge[i]);
if(eNum == N-1) {
maxlen = edge[i].w;
break;
}
}
}
System.out.println(maxlen);
System.out.println(arr.size());
for (int i = 0; i < arr.size(); i++) {
Edge edg = arr.get(i);
System.out.println(edg.a+" "+edg.b);
}
}
}