#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int head[1000000];
struct node{
int from,to,v,next;
}edge[1000000];
int n,m;
int fa[1000000];
int cnt;
bool cmp(node x,node y){
return x.v<y.v;
}
void add(int from,int to,int v){
edge[++cnt].from=from;
edge[cnt].to=to;
edge[cnt].v=v;
edge[cnt].next=head[from];
head[from]=cnt;
}
int find(int x){
if(fa[x]==x){
return x;
}else{
fa[x]=find(fa[x]);
}
}
void hb(int x,int y){
int fx=fa[x],fy=fa[y];
fa[fx]=find(fa[fy]);
}
int main(){
cin >>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin >>u>>v>>w;
add(u,v,w);
}
sort(edge+1,edge+1+m,cmp);
int num=0,sum=0;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=cnt;i++){
int x=edge[i].from,y=edge[i].to;
if(fa[x]!=fa[y]){
num++;
hb(fa[x],fa[y]);
sum=max(sum,edge[i].v);
}
if(num==n-1){
cout <<num<<" "<<sum;
return 0;
}
}
return 0;
}