#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>

using namespace std;

struct edge{
	int to,cost;
};
typedef pair<int,int> P;//firstがcost,secondがnodeを表す

vector<edge> G[20];//町から出る道を管理
int N;
int d[20];
const int INF=100000000;
bool flag=true;


void djikstra(int s){
	for(int i=0;i<N;i++){
		d[i]=INF;
	}
	
	priority_queue<P,vector<P>,greater<P> > que;//greater修正必要かも
	d[s]=0;
	//P np={0,s};
	que.push(P(0,s));
	
	while(que.size()){//確定したらそこから到達できるnodeをqueに登録する
		P p=que.top(); que.pop();
		int v=p.second;
		if(d[v]!=p.first) continue;//一度d[v]<p.totalになったらそのvはもう確定している
		for(int i=0;i<G[v].size();i++){
			edge e=G[v][i];
			if(d[v]+e.cost<d[e.to]){
				d[e.to]=d[v]+e.cost;
				//P np1={d[e.to],e.to};間違い
				que.push(P(d[e.to],e.to));
			}
		}
	}
}
int A[10000][2];
int counter=0;
void solve(){
	int R,mind=INF,ans;N=0;
	cin>>R;
	if(R==0) {flag=false; return;}
	for(int i=0;i<R;i++){
		int x,y,c;
		cin>>x>>y>>c;
		N=max(N,max(x,y));
		edge ne1={y,c},ne2={x,c};
		G[x].push_back(ne1);
		G[y].push_back(ne2);
	}
	N++;
	int D[20]={0};
	for(int i=0;i<N;i++){
		djikstra(i);
		for(int j=0;j<N;j++){
			D[i]+=d[j];
		}
	}
	for(int i=0;i<N;i++){
		if(mind>D[i]){
			ans=i;
			mind=D[i];
		}
	}
	A[counter][0]=ans;A[counter][1]=mind;
	counter++;
	//cout<<ans<<" "<<mind<<endl;
}

int main(){
	while(flag){
		solve();
	}
	for(int i=0;i<counter;i++){
		cout<<A[i][0]<<" "<<A[i][1]<<endl;
	}
}