#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=1e5+2e6+10,M=3e6+10,Z=1e9+7,ms63=1061109567;
int casenum,casei;
int id;
int first[N],w[M],c[M],nxt[M];
LL f[N],F[N];
bool e[N];
struct node
{
int x;LL v;
node(){}
node(int x_,LL v_){x=x_;v=v_;}
bool operator < (const node& b)const{return v>b.v;}
};
void ins(int x,int y,int z)
{
id++;
w[id]=y;
c[id]=z;
nxt[id]=first[x];
first[x]=id;
}
priority_queue<node>q;
void inq(int x,LL dis)
{
if(dis>=f[x])return;
f[x]=dis;
q.push(node(x,dis));
}
void dijkstra(int st)
{
MS(f,63);
MS(e,0);
inq(st,0);
q.push(node(st,0));
while(!q.empty())
{
int x=q.top().x;q.pop();
if(e[x])continue;e[x]=1;
for(int z=first[x];z;z=nxt[z])inq(w[z],f[x]+c[z]);
}
}
int main()
{
scanf("%d",&casenum);
for(casei=1;casei<=casenum;casei++)
{
MS(first,0);id=1;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int dis,g,x;
scanf("%d%d",&dis,&g);
int in=n+i;
int out=n+m+i;
ins(in,out,dis);
while(g--)
{
scanf("%d",&x);
ins(x,in,0);
ins(out,x,0);
}
}
dijkstra(1);
MC(F,f);
dijkstra(n);
LL ans=1e18;
int ed;
for(int i=1;i<=n;i++)
{
gmax(F[i],f[i]);
if(F[i]<=ans)
{
ans=F[i];
ed=i;
}
}
if(ans==1e18)printf("Case #%d: Evil John\n",casei);
else
{
printf("Case #%d: %lld\n",casei,ans);
for(int i=1;i<ed;i++)if(F[i]==ans)printf("%d ",i);
printf("%d\n",ed);
}
}
return 0;
}
/*
【trick&&吐槽】
点数N=n+2*最大集合数=1e5+2e6
边数M=3*最大集合数=3e6
【题意】
两个人A,B想要见面。
有n([2,1e5])个点,A初始在1点,B初始在n点。
有m个集合关系,第i个集合有Si个点,这些点两两之间移动所花费的时间都为dis([1,1e9]),有∑Si<=1e6。
让你输出A和B在哪些点碰面,使得他们能在最早时间相遇。
输出这个最早相遇时间以及所有满足的点。
【类型】
最短路
【分析】
这题很显然是一个最短路模型。然而如果暴力建边,边数可达1e12条,爆炸。
问题是怎么处理集合关系。比较好想,我读完题的瞬间就想到了做法——拆点。
对每个集合构造两个点,入点和出点,之间连一条边权为dis的边,
把集合内的每个点向这个集合的入点连边,边权为0,
把集合的出点向这个集合内的每个点连边,边权为0。
这样就实现了,对于每个集合,利用2Si+1条边,改变其内任意两个点的边权都为dis。
然后分别以1和n为起点,跑最短路,然后扫描一下即可。
【时间复杂度&&优化】
O(mlogm)
【数据】
input
2
5 4
1 3 1 2 3
2 2 3 4
10 2 1 5
3 3 3 4 5
3 1
1 2 1 2
output
Case #1: 3
3 4
Case #2: Evil John
*/