/*
魔咒的长度就相当于图中边的权值,而且告诉我们是无向图,因为正反都可以变且魔咒长度相同。
相当于求解相对于每个节点来说能到达的最远距离的最小值是多少。
是一个多源最短路问题,应用弗罗伊德算法解决。
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000010
int N,M;
int a[101][101];
//考察最短路--从所有路径中选择出 【最长路径】最小的那条路径
//采用floyd算法
void Floyd(){
for(int k=1;k<=N;k++){
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (a[i][j] > a[i][k] + a[k][j]) {
a[i][j] = a[i][k] + a[k][j];
}
}
}
}
}
int main(){
cin>>N>>M;
//初始化距离数组a
for(int i=0;i<=N;i++){
for(int j=0;j<=N;j++) {
if(i==j) a[i][j]=0;
else a[i][j]=inf;
}
}
int c,b,dis;
for(int k=0;k<M;k++){
cin>>c>>b>>dis;
a[b][c]=a[c][b]=dis;
}
Floyd();
//p:为这些点中到各个点的最短-最长路径的起始点
//mint:p作为起始点到各个点距离中的最长距离
int p=0,mint=inf,maxt=0;
for(int i=1;i<=N;i++){
maxt=0;//i作为起始点到各个点距离中的最长距离
for(int j=1;j<=N;j++){
if(maxt<=a[i][j]) maxt=a[i][j];
}
if(mint>maxt){
mint=maxt;
p=i;
}
}
if(p==0) cout<<"0"<<endl;
else cout<<p<<" "<<mint;
return 0;
}