//zoj 2913 BFS // 从每条线路上的每个地区出发进行BFS遍历, // 统计每条线路上每个地区到其他地区最短距离中的最大值,求出所有最大值中的最小值。 #include<stdio.h> #include<queue> #include<string.h> using namespace std; #define MAX 10000 #define INF 100000 int nz,nr,cur; int mz[MAX]; int Edge[MAX][10]; int res[MAX],reach[MAX]; void bfs(int s) { int i,a,b,val,at; queue<int> q[2]; a=0;b=1;val=0; if(reach[s]<cur) { q[b].push(s); reach[s]=cur; res[s]=max(res[s],val+1); } while(!q[b].empty()) { swap(a,b); val++; while(!q[a].empty()) { at=q[a].front(); q[a].pop(); for(i=0;i<mz[at];i++) if(reach[Edge[at][i]]<cur) { q[b].push(Edge[at][i]); reach[Edge[at][i]]=cur; res[Edge[at][i]]=max(res[Edge[at][i]],val+1); } } } } int main() { //freopen("input.txt","r",stdin); int T,i,j,t,id,mr,ret,center; scanf("%d",&T); for(t=0;t<T;t++) { memset(reach,-1,sizeof(reach)); memset(res,0,sizeof(res)); cur=0; scanf("%d%d",&nz,&nr); for(i=0;i<nz;i++) { scanf("%d",&id); scanf("%d",&mz[id]); for(j=0;j<mz[id];j++) scanf("%d",&Edge[id][j]); } for(i=0;i<nr;i++) { scanf("%d",&mr); for(j=0;j<mr;j++) { scanf("%d",&id); bfs(id); cur++; } } ret=MAX,center=-1; for(i=0;i<10000;i++) { if(reach[i]==cur-1&&res[i]<ret) { ret=res[i]; center=i; } } printf("%d %d\n",ret,center); } return 0; }