#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#define maxn 100+1
using namespace std;
inline int qread()
{
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num10+c-'0';
return numf;
}
int l,t,vis[maxn],in[maxn]; //l和t分别为题目中的l和t,vis数组表示这个循环变量是否在第一个双端队列中,in为第二个。
string s;
int main()
{
t=qread();
while(t--)
{
memset(vis,0,sizeof(vis)); //对于每组数据,vis和in都要清空。
memset(in,0,sizeof(in));
deque<int>q1,q2; //双端队列。
scanf("%d",&l);
getline(cin,s); //getline可以读入带空格的字符串。
int cf,sum=0,stop=0,f=0; //cf表示当前程序题目给出的时间复杂度,sum表示当前程序实际的时间复杂度,f用来分类输出。
if(s[3]'1') cf=0; //O(1)即O(n的0次方)。。。为什么这里是s[3]?因为先输入的一个l,然后有个空格,这个空格是占数组位置的,数组位置从0开始。
else
{
int now=5;cf=0; //同理。
while(isdigit(s[now])) cf=cf*10+s[now++]-'0'; //跟快读原理一样。
}
while(l--) //对于每个循环的开头进行讨论。
{
getline(cin,s);
if(s[0]'F')
{
int x=s[2]-'a'+1; //把循环变量转化为int类型。
q1.push_front(x); //加入第一个队列。
if(!vis[x]) //如果x未被标记。
{
}
if(s[0]!='F'&&s[0]!='E') f=1; //如果行首出现其他字母,则是语法错误。
}
if(!q1.empty()) f=1; //最后,如果第二个队列还有循环元素(E都没了还有元素),则有语法错误。
}