/*
题目是很水的,但是题意理解比较困难,直接上floyd算法求最短路径,
但是要注意题上的隐藏条件(也可能不是,,,反正,我没看出来)是一个经纪人会同时给所有人散布谣言,也就是说,使用floyd之后
要计算出每一行的最大值(也就是当前源点给其他人散布谣言的最长时间),再讲每一行的最大值进行对比求出
最大值的最小值,即为所求。
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <iomanip>
using namespace std;
const int inf=0x3f3f3f;
int dis[101][101];
int i,j,k;
int n;
void floyd() //floyd算法使用三段循环,时间复杂度为n^3
{
for (int k=1;k<=n;k++)
{
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (i!=j&&dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
int maxlength; //保存最长路径
int min_in_max=inf; //保存最长路径中的最小值
int flag_source; //记录第几个人。
for (int i=1;i<=n;i++)
{
int max_=0;
for (int j=1;j<=n;j++)
{
if (i!=j&&max_<dis[i][j])
{
max_=dis[i][j];
}
}
if (i!=j&&min_in_max>max_)
{
flag_source=i;
min_in_max=max_;
}
}
if(min_in_max<inf)
cout<<flag_source<<' '<<min_in_max<<endl;
else
cout<<"disjoint"<<endl;
return;
}
int main()
{
while (1)
{
memset(dis,inf,sizeof(dis));
cin>>n;
if (!n) break;
for (int i=1;i<=n;i++)
{
int pair_;
cin>>pair_;
for (int j=1;j<=pair_;j++)
{
int cat,time;
cin>>cat>>time;
dis[i][cat]=time;
}
}
floyd();
}
return 0;
}