package com.company.exam.adv;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
public class Zhexuejia {
static NodeZhexuejia[] nodes;
static int w,f,a,e;
public static void main(String[] args) throws Exception{
long startTime=System.currentTimeMillis();
System.setIn(new FileInputStream("C:\\Users\\XAGDC\\Desktop\\sw\\44-18年7月ADV 哲学家的石头 철학자의 돌\\eval_input.txt"));
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(reader.readLine());
int T=Integer.parseInt(st.nextToken());
for (int t = 0; t <T ; t++) {
st=new StringTokenizer(reader.readLine());
int N=Integer.parseInt(st.nextToken());
int M=Integer.parseInt(st.nextToken());
int K=Integer.parseInt(st.nextToken());
nodes=new NodeZhexuejia[N+M+1];
for (int i = 0; i <nodes.length ; i++) {
nodes[i]=new NodeZhexuejia(i);
}
for (int i = 1; i <=N ; i++) {
char[] chars=reader.readLine().toCharArray();
for (char s:chars) {
if(s=='W'){
nodes[i].w++;
}else if(s=='F'){
nodes[i].f++;
}else if(s=='A'){
nodes[i].a++;
}else if(s=='E'){
nodes[i].e++;
}
}
}
for (int i = 1; i <=M ; i++) {
//NodeZhexuejia node=new NodeZhexuejia(N+i);
//node.leaf=false;
st=new StringTokenizer(reader.readLine());
int start=Integer.parseInt(st.nextToken());
int son1=Integer.parseInt(st.nextToken());
int son2=Integer.parseInt(st.nextToken());
nodes[start].sonList.add(son1);
nodes[start].sonList.add(son2);
}
w=0;
f=0;
a=0;
e=0;
process(K);
System.out.printf("#%d %d %d %d %d \n",(t+1),w,f,a,e);
}
reader.close();
System.out.println(System.currentTimeMillis()-startTime);
}
public static void process(int start){
LinkedList<Integer> list=new LinkedList();
LinkedList<Integer> rlist=new LinkedList();
list.add(start);
while(!list.isEmpty()){
int index=list.pop();
NodeZhexuejia node=nodes[index];
if(node.sonList.size()!=0){//这个节点不是叶子节点,把他的子节点加入进来
for (int sonIndex:node.sonList) {
list.add(sonIndex);
}
}else{//这个节点是底层叶子节点
rlist.add(index);
}
}
for (int index:rlist) {
w=w+nodes[index].w;
f=f+nodes[index].f;
a=a+nodes[index].a;
e=e+nodes[index].e;
}
}
}
class NodeZhexuejia{
int index;
boolean leaf;
int w;
int f;
int a;
int e;
List<Integer> sonList;
public NodeZhexuejia(int index){
this.index=index;
this.sonList=new ArrayList<>();
}
}