#include <iostream>
using namespace std;
int n,i,j,k,q,t,map[200][200];
int main()
{
cin >> n;
while (n != 0)
{
for (i = 1;i <= n;i++)
for (j = 1;j <= n;j++)
map[i][j] = -1; //初始化
for (i = 1;i <= n;i++)
{
cin >> k;
for (t = 1;t <= k;t++)
{
cin >> j >> q;
map[i][j] = q;
}
}
/*不能太早的把i-k-j的距离确定下来了,假设一旦找到了i-p-j最短的距离后,i到j就相
当处理完了,以后不会在改变了,一旦以后有使i到j的更短的距离时也不能再去更新
了,所以结果一定是不对的。因此应该将k放在最外层循环*/
for (k = 1;k <= n;k++) //Floyd,注意循环嵌套,要将k放在最外层循环
for (i = 1;i <= n;i++)
for (j = 1;j <= n;j++)
if ((map[i][k] != -1) && (map[k][j] != -1))
{
if (map[i][j] == -1) //i,j之间没有直接通路
map[i][j] = map[i][k]+map[k][j];
else
if (map[i][j] > map[i][k]+map[k][j])
map[i][j] = map[i][k]+map[k][j];
}
bool flag,tflag; //flag记录是否有答案,tflag记录第i个人是否能与另外N-1人都联系上
int tmax,result,ans;
flag = false;
result = 0;
ans = 0;
for (i = 1;i <= n;i++) //起始点i,因为由i出发要把消息传达到每一个人,所以要到所有人
{ //都收到消息才能算时间,也就是由i开始到每一个其他点所需时间的
tflag = false; //中的max时间(由同一个i出发中的max time) //|
tmax = 0; //|
for (j = 1;j <= n;j++) //|
if (i != j) //|
{ //|
if (map[i][j] == -1) //如果有人联系不上,那么标记TFLAG并且退出j的循环 //|
{ //|
tflag = true; //|
break; //|
} //|
if (tmax < map[i][j]) //如果i,j能联系上且时间比 //|
tmax = map[i][j]; //<<----------------------------------------|
}
if (tflag == false) //如果全部都能联系上
{
if (flag == false) //第一次要先给result赋值,不然下面没法让result跟tmax做比较
{
flag = true;
result = tmax;
ans = i;
}
else //第一次之后如果有某一个i开始的tmax比之前的result都小酒就新result
if (result > tmax)
{
result = tmax;
ans = i;
}
}
}
if (flag == true)
cout << ans << ' ' << result << endl;
else
cout << "disjoint" << endl;
cin >> n;
}
return 0;
}