最小生成树,裸的
//By AcerMo
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=105000;
struct edge
{
int fr,to,co;
bool friend operator < (edge a,edge b)
{
return a.co>b.co;
}
}add,now;
priority_queue<edge>q;
int n,m;
int fa[M],siz[M];
inline int read()
{
int x=0;char ch=getchar();
while (ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
inline int find(int x)
{
if (fa[x]!=x) return fa[x]=find(fa[x]);
return x;
}
inline void unionn(int a,int b)
{
if (siz[a]<=siz[b]) siz[b]+=siz[a],fa[a]=b;
else siz[a]+=siz[b],fa[b]=a;
return ;
}
inline void constt()
{
for (int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
return ;
}
inline void kru()
{
int cnt=1,maxa=0;
while (cnt<n&&q.size())
{
now=q.top();q.pop();
int r1=find(now.fr);
int r2=find(now.to);
if (r1!=r2)
unionn(r1,r2),cnt++,maxa=now.co;
}
cout<<n-1<<" "<<maxa;
return ;
}
signed main()
{
n=read();m=read();constt();
for (int i=1;i<=m;i++)
add.fr=read(),add.to=read(),add.co=read(),q.push(add);
kru();
return 0;
}