/*
直接在二维字符数组中递归,无须建树
注意对空树的处理,以及,结点标号可以是任意可打印字符
其他链接:
1. http://www.cnblogs.com/Bob-tong/p/6610647.html
isspace()函数的功能为:判断输入字符是否为空格/回车/制表符等 (而不仅仅只是判断空格)
2. http://blog.csdn.net/daiyutage/article/details/8540932
fgets()函数的有关介绍,一般 fgets()会比用 gets()安全,所以很有必要仔细研究下 fgets()的用法
3. http://www.cnblogs.com/kex1n/archive/2011/06/09/2076501.html
sscanf()函数,利用它可以从字符串中取出整数、浮点数和字符串等等
*/
#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
const int N = 200 + 10;
int n;
char buf[N][N];
// 递归遍历并且输出以字符 buf[r][c] 为根的树
void dfs(int r, int c)
{
printf("%c(", buf[r][c]);
if ( r + 1 < n && buf[r + 1][c] == '|' ) //有子树
{
int i = c;
while ( i - 1 >= 0 && buf[r + 2][i - 1] == '-' ) i--; //找“----”的左边界
while ( buf[r + 2][i] == '-' && buf[r + 3][i] != '\0' )
{
if ( !isspace (buf[r + 3][i]) ) dfs(r + 3, i); // fgets 读入的 '\n' 也满足 isspace()
i++;
}
}
printf(")");
}
void solve()
{
n = 0;
while (true)
{
fgets(buf[n], N, stdin);
if (buf[n][0] == '#') break; else n++;
}
printf("(");
if (n)
{
for (int i = 0; i < strlen(buf[0]); i++)
if (buf[0][i] != ' ')
{
dfs(0, i);
break;
}
}
printf(")\n");
}
int main()
{
int t;
// fgets(buf[0], N, stdin);
// sscanf(buf[0], "%d", &t);
scanf("%d", &t);
getchar();
while (t--)
solve();
return 0;
}