#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <limits.h>
#include <math.h>

#include <iostream>
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <bitset>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdio>

using namespace std;

const int INF = 1e+8;

const int V_MAX = 10;
int V, E;
int cost[V_MAX][V_MAX];
bool used[V_MAX];
int d[V_MAX];

void dijkstra(int s) {
	int i, j;
	for (i=0; i<V; i++) {
		d[i] = INF;		
		used[i] = false;
	}

	d[s] = 0;
	while (1) {
		//未使用の頂点を探す
		int v = -1;
		for (i=0; i<V; i++)
			if (!used[i] && (v == -1 || d[i] < d[v]))
				v = i;

		if (v == -1) break;	//もう更新する頂点が無いからwhile抜ける
	
		//未使用の頂点vからの距離を計算
		used[v] = true;
		for (i=0; i<V; i++)
			d[i] = min(d[i], d[v] + cost[v][i]);
	}
}

int main() {
	int i, j;
	int total;
	int minT;

	while (1) {
		scanf("%d ", &E);
		if (!E) break;

		for (i=0; i<V_MAX; i++)
			for (j=0; j<V_MAX; j++)
				cost[i][j] = INF;
		for (i=0; i<V_MAX; i++)
			cost[i][i] = 0;

		V = 0;
		for (i=0; i<E; i++) {
			int vFrom, vTo, vCost;
			scanf("%d%d%d ", &vFrom, &vTo, &vCost);
			cost[vTo][vFrom] = cost[vFrom][vTo] = vCost;
			V = max(V, vFrom);
			V = max(V, vTo);
		}
		V++;	//Vを頂点の個数にするため++

		total = INF;
		minT = INF;
		for (i=0; i<V; i++) {
			dijkstra(i);

			int sum = 0;
			for (j=0; j<V; j++)
				sum += d[j];

			if (sum < total) {
				total = sum;
				minT = i;
			} else if (sum == total && i < minT)
				minT = i;
		}

		printf("%d %d\n", minT, total);
	}	

	return 0;
}