#include<bits/stdc++.h>
#define Max 99999
using namespace std;
class Graph
{
int ver_num;
int **adjacency;
string *ver;
string start;
string *Path;
public:
Graph()
{
cin >> ver_num;
ver = new string[ver_num];
Path = new string[ver_num];
for (int i = 0; i < ver_num; i++)
{
cin >> ver[i];
adjacency = new int *[ver_num];
}
for (int i = 0; i < ver_num; i++)
{
adjacency[i] = new int[ver_num];
for (int j = 0; j < ver_num; j++)
{
cin >> adjacency[i][j];
if (adjacency[i][j] == 0)
adjacency[i][j] = Max;
}
}
cin >> start;
}
int Index(string a)
{
for (int i = 0; i < ver_num; i++)
if (a == ver[i])
return i;
return -1;
}
void Dijkstra()
{
int i, j, Current, min;
bool *Final = new bool[ver_num];
int *Dest = new int[ver_num];
int index = Index(start);
for (int i = 0; i < ver_num; i++)
{
Path[i] = start + " ";
Dest[i] = adjacency[index][i];
Final[i] = false;
}
Dest[index] = 0;
Final[index] = true;
for (i = 0; i < ver_num - 1; i++)
{
min = Max;
Current = -1;
for (j = 0; j < ver_num; j++)
{
if (Final[j] == false && min > Dest[j])
{
Current = j;
min = Dest[j];
}
}
if (Current != -1)
{
Final[Current] = true;
Path[Current] += ver[Current] + " ";
for (int q = 0; q < ver_num; q++)
{
if (Final[q] == false && min + adjacency[Current][q] < Dest[q])
{
Dest[q] = min + adjacency[Current][q];
Path[q] = Path[Current];
}
}
}
}
for (int i = 1; i < ver_num; i++)
{
cout << ver[0] << "-" << ver[i];
if (Dest[i] >= Max)
{
cout << "--1" << endl;
continue;
}
cout << "-" << Dest[i] << "----[" << Path[i] << "]" << endl;
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
Graph MyGraph;
MyGraph.Dijkstra();
}
return 0;
}