#include <iostream>
#include <stdio.h>
#define INF 1000
#define maxn 100000
using namespace std;
int map[INF][INF];
int t,maxs,mintime,a,w,n,pos;
void Floyd()
{
for( int k = 1; k <= t; k++)
for( int i = 1; i <= t; i++)
for( int j = 1; j <= t; j++ )
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
return ;
}
int main()
{
while(scanf("%d",&t),t)
{
for( int i = 1; i<=t ; i++)
for( int j = 1; j<= t; j++)
{
if( i != j)
map[i][j] = maxn;
else
map[i][j] = 0;
}
for( int i = 1; i <= t; i++)
{
scanf("%d",&n);
for( int j = 1; j<=n; j++)
{
scanf("%d%d",&a, &w);
map[i][a] = w;
}
}
Floyd();
mintime = 100000;
for( int j = 1; j<= t ; j++)
{
maxs = 0;
for( int i = 1; i<=t ; i++)
{
if( map[j][i] > maxs)
maxs = map[j][i];
}
if(mintime > maxs)
{
mintime = maxs;
//cout<<mintime<<endl;
pos = j;
}
}
// for( int i = 1; i<= t; i++)
//{for( int j = 1; j<= t; j++)
//cout<<map[i][j]<<" ";
//cout<<endl;}
//cout<<pos<<' '<<mintime<<endl;
if(mintime != maxn)
printf("%d %d\n",pos,mintime);
else
printf("disjoint\n");
}
}
#include <stdio.h>
#define INF 1000
#define maxn 100000
using namespace std;
int map[INF][INF];
int t,maxs,mintime,a,w,n,pos;
void Floyd()
{
for( int k = 1; k <= t; k++)
for( int i = 1; i <= t; i++)
for( int j = 1; j <= t; j++ )
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
return ;
}
int main()
{
while(scanf("%d",&t),t)
{
for( int i = 1; i<=t ; i++)
for( int j = 1; j<= t; j++)
{
if( i != j)
map[i][j] = maxn;
else
map[i][j] = 0;
}
for( int i = 1; i <= t; i++)
{
scanf("%d",&n);
for( int j = 1; j<=n; j++)
{
scanf("%d%d",&a, &w);
map[i][a] = w;
}
}
Floyd();
mintime = 100000;
for( int j = 1; j<= t ; j++)
{
maxs = 0;
for( int i = 1; i<=t ; i++)
{
if( map[j][i] > maxs)
maxs = map[j][i];
}
if(mintime > maxs)
{
mintime = maxs;
//cout<<mintime<<endl;
pos = j;
}
}
// for( int i = 1; i<= t; i++)
//{for( int j = 1; j<= t; j++)
//cout<<map[i][j]<<" ";
//cout<<endl;}
//cout<<pos<<' '<<mintime<<endl;
if(mintime != maxn)
printf("%d %d\n",pos,mintime);
else
printf("disjoint\n");
}
}