#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<unordered_map>
using namespace std;
int visit[10000],minCnt,minTransfer;
vector<vector<int>> v(10000);
vector<int> path,tempPath;//路径vector
int start,end1;//起点 终点
unordered_map<int,int> line;
/*unordered_map<int,int>line存储两个结点的边所属的路线
假设边两端为a到b,line的键为a*10000+b,值为这条边所属的路线*/
int transferCnt(vector<int> a){//传入临时路径
int cnt=-1,preLine=0;
for(int i=1;i<a.size();i++){
if(line[a[i-1]*10000+a[i]] != preLine)
cnt++;//换乘数cnt+1
preLine=line[a[i-1]*10000+a[i]];
}
return cnt;//输出换乘数
}
void dfs(int node,int cnt){ //cnt为换乘数
if(node==end1&&(cnt<minCnt||(cnt ==minCnt&&
transferCnt(tempPath) <minTransfer))) {
minCnt=cnt;//更新cnt
minTransfer=transferCnt(tempPath);//更新最小换乘次数
path=tempPath;//更新路径vector
}
if(node == end1) return;//边界
for(int i=0;i<v[node].size();i++){
if(visit[v[node][i]] == 0){
visit[v[node][i]]=1;//加锁
tempPath.push_back(v[node][i]);
dfs( v[node][i] ,cnt+1); //cnt+1,进入下一层dfs
visit[v[node][i] ]=0;//解锁
tempPath.pop_back();
}
}
}
int main(){
int n,m,k,pre,temp;
scanf("%d",&n);//地铁路线数
for(int i=0;i<n;i++){
scanf("%d%d",&m,&pre);//pre为m线路的首站
for(int j=1;j<m;j++){//for循环剩下的m-1个站
scanf("%d",&temp);
v[pre].push_back(temp);
//首站为pre的线路(vector里)加上temp站
v[temp].push_back(pre);
//temp站的vector里加入首站(pre)
line[pre*10000+temp]=line[temp*10000+pre]=i+1;
//pre到temp的线路=temp到pre的线路+1
pre=temp;//首站为temp
}
}
scanf("%d",&k);//k次查询
for(int i=0;i<k;i++){
scanf("%d%d",&start,&end1);
//查询start站到end1站
//minCnt为最小换乘数,minTransfer为换乘站
minCnt=99999,minTransfer=99999;//初始化
tempPath.clear();
tempPath.push_back(start);//把start压入临时路径vector
visit[start]=1; //加锁
dfs(start,0); //递归DFS!!!!!!!!!
visit[start]=0; //解锁
//以下为output
printf("%d\n",minCnt);//起点&终点之间的min站数
int preLine=0,preTransfer=start;
for(int j=1;j<path.size() ; j++){
if(line[path[j-1]*10000+path[j]] != preLine){
if(preLine != 0) //每当line和preline不等则输出这句话
printf("Take Line#%d from %04d to %04d.\n",
preLine,preTransfer,path[j-1] );
preLine=line[path[j-1]*10000+path[j]];//更新上一条线路号
preTransfer = path[j-1];//更新上一个换乘站
}
}
printf("Take Line#%d from %04d to %04d.\n",
preLine,preTransfer,end1);//输出最后一小截线路
//preLine路线 从preTransfer站到end1站
}
system("pause");
return 0;
}