#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <queue>
#define rep(i, l, r) for(int i = l; i <= r; i++)
#define down(i, l, r) for(int i = l; i >= r; i--)
#define MS 123456
#define MAX 1037471823
using namespace std;
struct node
{
int x, y, z;
bool operator < (const node &k) const { return z < k.z; }
} c[MS];
int n, m, a, h[345];
int Head(int x)
{
while (h[h[x]] != h[x]) h[x] = h[h[x]];
return h[x];
}
int main()
{
scanf("%d%d", &n, &m); printf("%d ", n-1);
rep(i, 1, m) scanf("%d%d%d", &c[i].x, &c[i].y, &c[i].z);
rep(i, 1, n) h[i] = i; sort(c+1, c+1+m);
rep(i, 1, m)
{
if (Head(c[i].x) != Head(c[i].y)) h[h[c[i].x]] = h[c[i].y], a++;
if (a == n-1) { printf("%d\n", c[i].z); break; }
}
return 0;
}
I2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxxdWV1ZT4KCiNkZWZpbmUgcmVwKGksIGwsIHIpIGZvcihpbnQgaSA9IGw7IGkgPD0gcjsgaSsrKQojZGVmaW5lIGRvd24oaSwgbCwgcikgZm9yKGludCBpID0gbDsgaSA+PSByOyBpLS0pCiNkZWZpbmUgTVMgMTIzNDU2CiNkZWZpbmUgTUFYIDEwMzc0NzE4MjMKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kZQp7CglpbnQgeCwgeSwgejsKCWJvb2wgb3BlcmF0b3IgPCAoY29uc3Qgbm9kZSAmaykgY29uc3QgeyByZXR1cm4geiA8IGsuejsgfQp9IGNbTVNdOwppbnQgbiwgbSwgYSwgaFszNDVdOwoKaW50IEhlYWQoaW50IHgpCnsKCXdoaWxlIChoW2hbeF1dICE9IGhbeF0pIGhbeF0gPSBoW2hbeF1dOwoJcmV0dXJuIGhbeF07Cn0KCmludCBtYWluKCkKewoJc2NhbmYoIiVkJWQiLCAmbiwgJm0pOyBwcmludGYoIiVkICIsIG4tMSk7CglyZXAoaSwgMSwgbSkgc2NhbmYoIiVkJWQlZCIsICZjW2ldLngsICZjW2ldLnksICZjW2ldLnopOwoJcmVwKGksIDEsIG4pIGhbaV0gPSBpOyBzb3J0KGMrMSwgYysxK20pOwoJcmVwKGksIDEsIG0pIAoJewoJCWlmIChIZWFkKGNbaV0ueCkgIT0gSGVhZChjW2ldLnkpKSBoW2hbY1tpXS54XV0gPSBoW2NbaV0ueV0sIGErKzsKCQlpZiAoYSA9PSBuLTEpIHsgcHJpbnRmKCIlZFxuIiwgY1tpXS56KTsgYnJlYWs7IH0KCX0KCXJldHVybiAwOwp9