#include<iostream>
#include<cstring>
using namespace std;
int map[100][100];
int dis[100];
bool vis[100];
string begin;
int n,be;
string name[100];
int path[100][100];
void init(){
for(int i=0;i<n;i++) {
dis[i]=1e9;
vis[i]=false;
for(int j=0;j<n;j++){
path[i][j]=-1;
if(map[be][j]>0&&map[be][j]<1e9) dis[j]=map[be][j];
}
}
}
int Find(string s){
for(int i=0;i<n;i++){
if(s==name[i]) return i;
}
}
void addpath(int a,int n){
int i=0;
while(path[a][i]!=-1) i++;
path[a][i]=n;
}
void copypath(int a,int b){
for(int i=0;i<=n;i++){
path[a][i]=path[b][i];
}
}
void dijkstra(){
dis[be]=0;
vis[be]=true;
for(int i=0;i<n-1;i++){
int min=1e9,now;
for(int j=0;j<n;j++){
if(vis[j]==false&&dis[j]<min) {
now=j;
min=dis[j];
}
}
vis[now]=true;
for(int j=0;j<n;j++){
if(vis[j]==false&&min+map[now][j]<dis[j]) {
dis[j]=min+map[now][j];
copypath(j,now);
addpath(j,now);
}
}
}
}
void display(){
for(int i=0;i<n;i++){
if(i!=be) {
cout<<begin<<"-"<<name[i]<<"-";
if(dis[i]>1e8) {
cout<<"-1"<<endl;
continue;
}
cout<<dis[i]<<"----["<<begin<<" ";
int j=0;
while(path[i][j]!=-1) {
cout<<name[path[i][j]]<<" ";j++;
}
cout<<name[i]<<"]"<<endl;
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>name[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>map[i][j];
if(map[i][j]==0) map[i][j]=1e9;
}
}
cin>>begin;
be=Find(begin);
init();
dijkstra();
display();
}
return 0;
}