#include <iostream>
using namespace std;
const int MAXVAL = 10000;
int
n = 0, gra[1001][1001] = {MAXVAL},
mp = 0, ans = 0, m = 0;
struct
primapp
{
int
to, wei;
primapp()
{
to = wei = 0;
}
}p[1001];
void
swap(primapp &p1, primapp &p2)
{
primapp p3 = p1;
p1 = p2;
p2 = p3;
}
int
findmin(int en)
{
int minn = MAXVAL;
mp = 0;
for(int i = en; i <= n - 1; i++)
if(minn > p[i].wei)
{
minn = p[i].wei;
mp = i;
}
return minn;
}
void
__primx__(int en)
{
if(en < n - 1)
{
for(int i = en + 1; i <= n - 1; i++)
if(gra[p[en].to][p[i].to] < p[i].wei
&& gra[p[en].to][p[i].to] > 0)
p[i].wei = gra[p[en].to][p[i].to];
//update
findmin(en + 1);
if(mp)
swap(p[en + 1], p[mp]);
if(ans < p[en + 1].wei)
ans = p[en + 1].wei;
__primx__(en + 1);
}
}
void
__read__()
{
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y >> gra[x][y];
gra[y][x] = gra[x][y];
}
for(int i = 1; i <= n - 1; i++)
{
p[i].to = i + 1;
p[i].wei = MAXVAL;
}
p[0].to = 1;
}
int
main()
{
__read__();
__primx__(0);
cout << n - 1 << " " << ans << endl;
return 0;
}