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

using namespace std;

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

int N;
int d[20];
vector<edge> e;
const int INF=100000000;
bool flag=true;


void BF(int s){
	for(int i=0;i<N;i++){
		d[i]=INF;
	}
	d[s]=0;
	
	bool update=true;
	while(update){
		update=false;
		for(int i=0;i<e.size();i++){
			edge ed=e[i];
			if(d[ed.from]!=INF&&d[ed.to]>d[ed.from]+ed.cost){
				d[ed.to]=d[ed.from]+ed.cost;
				update=true;
			}
			if(d[ed.to]!=INF&&d[ed.from]>d[ed.to]+ed.cost){
				d[ed.from]=d[ed.to]+ed.cost;
				update=true;
			}
		}
	}
	
	
}
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={x,y,c};
		e.push_back(ne1);
	}
	N++;
	int D[20]={0};
	for(int i=0;i<N;i++){
		BF(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;
	}
}