/*
*题目:Optic Communication
*链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1008&cid=27417
*题意:给出一些关键单词 VISIBLE A B 代表 A B 可以互相获取对方的发出的消息,OBSTACLE A B 与 WEATHER A B 都代表 A B 之间不能获取对方息,
MESSAGE A "HELLO" 代表 A 发出一条消息 "HELLO" ,特别需要注意的是消息中会含有空格,还有输出格式问题,比赛就挂了几次。最后按照 A-Z 的循序输出各自能接受到的消息。
*思路:建双向图,进行BFS,不断添加 发出的信息。
*/
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
char aa2[30];
string a, a1, a2;
string s[26];
int G[30][30];
queue<int>Q;
void BFS(){
int x;
int vis[30][30];
memset(vis, 0, sizeof vis);
while (!Q.empty()){
x = Q.front();
Q.pop();
for (int i = 0; i < 26; i++){
if (i != x){
if (G[x][i]&&vis[x][i] == 0){
s[i].append(a2);
Q.push(i);
vis[i][x] = vis[x][i] = 1;
}
}
}
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
memset(G, 0, sizeof G);
getchar();
for (int i = 0; i < 26; i++) s[i].clear();
for (int i = 0; i < n; i++){
cin >> a >> a1;
getchar();gets(aa2);
a2.clear();a2.append(aa2);
if (a == "VISIBLE" || a == "OBSTACLE" || a == "WEATHER"){
G[a1[0] - 'A'][a2[0] - 'A'] = !G[a1[0] - 'A'][a2[0] - 'A'];
G[a2[0] - 'A'][a1[0] - 'A'] = !G[a2[0] - 'A'][a1[0] - 'A'];
}
else {
while (!Q.empty())Q.pop();
Q.push(a1[0] - 'A');
BFS();
}
}
for (int i = 0; i < 26; i++){
if (!s[i].empty()) {
printf("%c: [", 'A' + i);
int l = s[i].length();
int cnt = 0;
for (int j = 0; j < l; j++){
printf("%c", s[i][j]);
if (s[i][j] == '\"') cnt++;
if (cnt % 2 == 0 && j != l - 1)printf(", ");
}
printf("]\n");
}
}
if (T>0) printf("\n");
}
return 0;
}