#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 10010, M = 1000010, T = 110;
int h[N], ea[M], eb[M], ne[M], line[M], w[M], idx;
int stop[T], dist[N], cnte[N];
bool st[N];
vector<vector<int>> path(N);
vector<int> ans, tmp;
void add(int a, int b, int c, int d){
ea[idx]=a, eb[idx]=b, line[idx]=c, w[idx]=d, ne[idx]=h[a], h[a]=idx++;
//a->b 线路编号为c 经过站点数为d
}
int dijkstra(int src, int des){
if( src==des ) return 0;
memset(st, 0, sizeof st);
memset(dist, 0x3f, sizeof dist); //站点数
memset(cnte, 0x3f, sizeof cnte); //经过的边数
dist[src] = 0;
cnte[src] = 0;
priority_queue<PII, vector<PII>, greater<PII>> hp;
hp.push({0, src});
while( hp.size() ){
auto t = hp.top();
hp.pop();
int d = t.first, u = t.second;
if( st[u] ) continue;
st[u] = true;
for( int i=h[u]; ~i; i=ne[i] ){
int j = eb[i];
if( dist[j] > d + w[i] ){
dist[j] = d + w[i];
hp.push({dist[j], j});
path[j].clear();
path[j].push_back(i); //用i来记录路径 a=ea[i], b=eb[i], id=line[i]
}
else if( dist[j] == d + w[i] ){
if( cnte[j] > cnte[u] + 1 ){ //距离相等选择换乘最少也就是经过边数最少的路线
cnte[j] = cnte[u] + 1;
path[j].clear();
path[j].push_back(i);
}
else if( cnte[j] == cnte[u] + 1 ){
path[j].push_back(i);
}
}
}
}
return dist[des];
}
void dfs(int u, int src){ //倒搜路径
if( ans.size() && tmp.size()>ans.size() ) return;
if( u==src ){
if( ans.empty() || ans.size() > tmp.size() ){
ans = tmp;
}
return;
}
for( auto i: path[u] ){
tmp.push_back(i);
dfs(ea[i], src);
tmp.pop_back();
}
}
void printPath(int src, int des){ //打印路径
if( ans.empty() ) return;
int j = ans.back();
int u = src, id = line[j];
for( int i=ans.size()-2; i>=0; i-- ){
if( id==line[ans[i]] ) continue;
printf("Take Line#%d from %04d to %04d.\n", id, u, ea[ans[i]]);
u = ea[ans[i]], id = line[ans[i]];
}
printf("Take Line#%d from %04d to %04d.\n", id, u, des);
}
int main(){
memset(h, -1, sizeof h);
int n, m;
scanf("%d", &n);
for( int i=1; i<=n; i++ ){
scanf("%d", &m);
for( int j=0; j<m; j++ ) scanf("%04d", &stop[j]);
for( int j=0; j<m; j++ ){
for( int k=j+1; k<m; k++ ){
int len = k-j;
if( stop[0]==stop[m-1] ) len = min(len, m-1-k+j); //环路取最短
add(stop[j], stop[k], i, len);
add(stop[k], stop[j], i, len);
}
}
}
scanf("%d", &m);
while( m-- ){
int src, des;
scanf("%04d %04d", &src, &des);
int t = dijkstra(src, des);
printf("%d\n", t);
ans.clear();
dfs(des, src);
printPath(src, des);
}
return 0;
}