#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
const int maxn=1e4+10;
int head[maxn],cnt=1,id[maxn][300],dp[200][300],tot,ti[300],dis[maxn][maxn],ci[maxn],n,ct;
bool fir[maxn],vis[maxn];
struct p{
int i,j;
p(int i_,int j_){
i=i_,j=j_;
}
p(){}
}path[200][300];
struct edge{
int to,nxt,w;
}e[maxn*maxn];
void add(int u,int v,int w){
e[cnt].to=v,e[cnt].w=w,e[cnt].nxt=head[u],head[u]=cnt++;
}
struct node{
int now,w;
node(int now_,int w_){
now=now_,w=w_;
}
node(){}
};
bool operator<(node x,node y){
return x.w>y.w;
}
priority_queue<node>q;
void dij(int s){
dis[s][s]=0,q.push(node(s,0));
memset(vis,0,sizeof(vis));
while(!q.empty()){
node now=q.top();
q.pop();
int u=now.now;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[s][v]>dis[s][u]+e[i].w){
dis[s][v]=dis[s][u]+e[i].w;
q.push(node(v,dis[s][v]));
}
}
}
}
void print(int i,int j){
if(i==0) return;
print(path[i][j].i,path[i][j].j);
if(j!=path[i][j].j){
printf("%d ",j);
}
}
map<int,int>mp;
int insert(int x){
if(mp.find(x)==mp.end()) mp[x]=++ct;
return mp[x];
}
int main(){
int T,cas=0;
while(~scanf("%d",&T)){
++cas;
if(T==0) break;
int op=T;
memset(fir,0,sizeof(fir)),memset(id,0,sizeof(id)),memset(head,0,sizeof(head));
cnt=1,tot=0,ct=0;
for(int i=1;i<=T;i++){
scanf("%d",&ti[i]);
int t,pre=-1;scanf("%d",&t);
for(int j=1;j<=t;j++){
int k;scanf("%d",&k);
k=insert(k);
id[k][i]=++tot;
if(j==1) fir[tot]=1;
else add(id[pre][i],tot,0);
pre=k;
}
}
for(int i=1;i<=tot;i++)
for(int j=1;j<=T;j++){
if(fir[id[i][j]]) continue;
for(int k=1;k<=T;k++)
if(fir[id[i][k]]) add(id[i][j],id[i][k],ti[k]);
}
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=tot;i++) dij(i);
scanf("%d",&T);
for(int t=1;t<=T;t++){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&ci[i]),ci[i]=insert(ci[i]);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=op;i++)
if(fir[id[ci[1]][i]]) dp[1][i]=ti[i];
for(int i=2;i<=n;i++)
for(int j=1;j<=op;j++)
for(int k=1;k<=op;k++)
if(dp[i-1][k]+dis[id[ci[i-1]][k]][id[ci[i]][j]]<dp[i][j]){
dp[i][j]=dp[i-1][k]+dis[id[ci[i-1]][k]][id[ci[i]][j]];
path[i][j]=p(i-1,k);
}
int ans=0x3f3f3f3f,an;
for(int i=1;i<=op;i++)
if(ans>dp[n][i]) an=i,ans=min(ans,dp[n][i]);
printf("Case %d, Trip %d: Cost = %d\n",cas,t,ans);
printf(" Tickets used: ");
print(n,an);
printf("\n");
}
}
return 0;
}