import java.io.*;
import java.util.*;
/**
*
* @author Bassem Ehab
*/
public class Main {
int testcases
= Integer.
parseInt(input.
readLine()); HashMap
<Integer, Boolean
> visited
= new HashMap
<>(); HashMap
<Character, Integer
> conv
= new HashMap
<>(); ArrayList<LinkedList<Integer>> graph = new ArrayList<>();
input.readLine();
while (testcases-- > 0) {
//StringTokenizer line = new StringTokenizer(input.readLine());
int count = 0;
if (!conv.containsKey(M.charAt(0))) {
conv.put(M.charAt(0), count++);
graph.add(conv.get(M.charAt(0)), new LinkedList<Integer>());
if (!visited.containsKey(conv.get(M.charAt(0)))) {
visited.put(conv.get(M.charAt(0)), false);
}
}
while (input.ready()) {
M = input.readLine();
if (M.isEmpty())break;
if (!conv.containsKey(M.charAt(0))) {
conv.put(M.charAt(0), count++);
if (!visited.containsKey(conv.get(M.charAt(0)))) {
visited.put(conv.get(M.charAt(0)), false);
}
}
if (!conv.containsKey(M.charAt(1))) {
conv.put(M.charAt(1), count++);
if (!visited.containsKey(conv.get(M.charAt(1)))) {
visited.put(conv.get(M.charAt(1)), false);
}
}
if (graph.size() >= conv.get(M.charAt(0)) + 1) {
graph.get(conv.get(M.charAt(0))).add(conv.get(M.charAt(1)));
} else {
graph.add(conv.get(M.charAt(0)), new LinkedList<Integer>());
graph.get(conv.get(M.charAt(0))).add(conv.get(M.charAt(1)));
}
if (graph.size() >= conv.get(M.charAt(1)) + 1) {
graph.get(conv.get(M.charAt(1))).add(conv.get(M.charAt(0)));
} else {
graph.add(conv.get(M.charAt(1)), new LinkedList<Integer>());
graph.get(conv.get(M.charAt(1))).add(conv.get(M.charAt(0)));
}
}
count = 0;
for (int i = 0; i < visited.size(); ++i) {
if (!visited.get(i)) {
visited.put(i, true);
Queue<Integer> temp = new LinkedList<>();
temp.add(i);
while (!temp.isEmpty()) {
int x = temp.poll();
visited.put(x, true);
if (!visited.get(get)) {
temp.add(get);
}
}
}
count++;
}
}
if (testcases
>= 1)System.
out.
println(); conv.clear();
visited.clear();
graph.clear();
}
}
}
CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKCi8qKgogKgogKiBAYXV0aG9yIEJhc3NlbSBFaGFiCiAqLwpwdWJsaWMgY2xhc3MgTWFpbiB7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBCdWZmZXJlZFJlYWRlciBpbnB1dCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CiAgICAgICAgaW50IHRlc3RjYXNlcyA9IEludGVnZXIucGFyc2VJbnQoaW5wdXQucmVhZExpbmUoKSk7CiAgICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBCb29sZWFuPiB2aXNpdGVkID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIEhhc2hNYXA8Q2hhcmFjdGVyLCBJbnRlZ2VyPiBjb252ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIEFycmF5TGlzdDxMaW5rZWRMaXN0PEludGVnZXI+PiBncmFwaCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGlucHV0LnJlYWRMaW5lKCk7CiAgICAgICAgd2hpbGUgKHRlc3RjYXNlcy0tID4gMCkgewogICAgICAgICAgICAvL1N0cmluZ1Rva2VuaXplciBsaW5lID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dC5yZWFkTGluZSgpKTsKICAgICAgICAgICAgU3RyaW5nIE0gPSBpbnB1dC5yZWFkTGluZSgpOwogICAgICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICAgICBpZiAoIWNvbnYuY29udGFpbnNLZXkoTS5jaGFyQXQoMCkpKSB7CiAgICAgICAgICAgICAgICBjb252LnB1dChNLmNoYXJBdCgwKSwgY291bnQrKyk7CiAgICAgICAgICAgICAgICBncmFwaC5hZGQoY29udi5nZXQoTS5jaGFyQXQoMCkpLCBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpKTsKICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5jb250YWluc0tleShjb252LmdldChNLmNoYXJBdCgwKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZC5wdXQoY29udi5nZXQoTS5jaGFyQXQoMCkpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGlucHV0LnJlYWR5KCkpIHsKICAgICAgICAgICAgICAgIE0gPSBpbnB1dC5yZWFkTGluZSgpOwogICAgICAgICAgICAgICAgaWYgKE0uaXNFbXB0eSgpKWJyZWFrOwogICAgICAgICAgICAgICAgaWYgKCFjb252LmNvbnRhaW5zS2V5KE0uY2hhckF0KDApKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnYucHV0KE0uY2hhckF0KDApLCBjb3VudCsrKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuY29udGFpbnNLZXkoY29udi5nZXQoTS5jaGFyQXQoMCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkLnB1dChjb252LmdldChNLmNoYXJBdCgwKSksIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWNvbnYuY29udGFpbnNLZXkoTS5jaGFyQXQoMSkpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udi5wdXQoTS5jaGFyQXQoMSksIGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5jb250YWluc0tleShjb252LmdldChNLmNoYXJBdCgxKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQucHV0KGNvbnYuZ2V0KE0uY2hhckF0KDEpKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChncmFwaC5zaXplKCkgPj0gY29udi5nZXQoTS5jaGFyQXQoMCkpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGdyYXBoLmdldChjb252LmdldChNLmNoYXJBdCgwKSkpLmFkZChjb252LmdldChNLmNoYXJBdCgxKSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBncmFwaC5hZGQoY29udi5nZXQoTS5jaGFyQXQoMCkpLCBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpKTsKICAgICAgICAgICAgICAgICAgICBncmFwaC5nZXQoY29udi5nZXQoTS5jaGFyQXQoMCkpKS5hZGQoY29udi5nZXQoTS5jaGFyQXQoMSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChncmFwaC5zaXplKCkgPj0gY29udi5nZXQoTS5jaGFyQXQoMSkpICsgMSkgewogICAgICAgICAgICAgICAgICAgIGdyYXBoLmdldChjb252LmdldChNLmNoYXJBdCgxKSkpLmFkZChjb252LmdldChNLmNoYXJBdCgwKSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBncmFwaC5hZGQoY29udi5nZXQoTS5jaGFyQXQoMSkpLCBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpKTsKICAgICAgICAgICAgICAgICAgICBncmFwaC5nZXQoY29udi5nZXQoTS5jaGFyQXQoMSkpKS5hZGQoY29udi5nZXQoTS5jaGFyQXQoMCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaXRlZC5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmdldChpKSkgewogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQucHV0KGksIHRydWUpOwogICAgICAgICAgICAgICAgICAgIFF1ZXVlPEludGVnZXI+IHRlbXAgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGQoaSk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCF0ZW1wLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHRlbXAucG9sbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkLnB1dCh4LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGdldCA6IGdyYXBoLmdldCh4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmdldChnZXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGQoZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb3VudCk7CiAgICAgICAgICAgIGlmICh0ZXN0Y2FzZXMgPj0gMSlTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgY29udi5jbGVhcigpOwogICAgICAgICAgICB2aXNpdGVkLmNsZWFyKCk7CiAgICAgICAgICAgIGdyYXBoLmNsZWFyKCk7CiAgICAgICAgfQogICAgfQp9Cg==