import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
class IslandUnderAttack {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int cs = 1; cs <= T; cs++) {
String[] wd = br.readLine().trim().split(" ");
int n = Integer.parseInt(wd[0]);
int m = Integer.parseInt(wd[1]);
int[][] dist = new int[n][m];
char[][] map = new char[n][m];
int shelter = 0;
int humans = 0;
for (int i = 0; i < n; i++) {
char[] inp = br.readLine().trim().toCharArray();
for (int j = 0; j < inp.length; j++) {
map[i][j] = inp[j];
if (Character.isDigit(inp[j])) {
dist[i][j] = (inp[j] - '0');
shelter += dist[i][j];
}
if (inp[j] == 'H')
humans += 1;
}
}
int d = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (dist[i][j] > 0) {
d += bfs(map, dist, shelter, humans, i, j);
}
}
}
int consumed = Math.max(humans - d, 0);
if (2 * consumed > humans || d == 0){
System.out.println("Case #" + cs + ": There is no survivor.");
}
else if (d == 1) {
System.out.println("Case #" + cs + ": There is 1 survivor.");
} else {
System.out.println("Case #" + cs + ": There are " + d + " survivors.");
}
}
br.close();
}
static void printInt(int[][] map) {
for (int[] df : map) {
System.out.println(Arrays.toString(df));
}
}
static void print(char[][] map) {
for (char[] df : map) {
System.out.println(Arrays.toString(df));
}
}
static int bfs(char[][] map, int[][] dist, int shelter, int total, int ii, int jj) {
int r = map.length;
int c = map[0].length;
Queue<int[]> qu = new LinkedList<>();
qu.add(new int[] { ii, jj, ii, jj });
int safe = 0;
int[][] dirs = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
boolean[][] seen = new boolean[r][c];
while (!qu.isEmpty()) {
int sz = qu.size();
while (sz-- > 0) {
int[] cr = qu.poll();
int i = cr[0];
int j = cr[1];
int si = cr[2];
int sj = cr[3];
if (dist[si][sj] < 1)
continue;
if (map[i][j] == 'H' && dist[si][sj] > 0) {
map[i][j] = '#';// Once shelter is reachable from shelter mark it as '#' and this can be used to readh other shelter.
safe += 1;
dist[si][sj] -= 1;
}
for (int[] d : dirs) {
int ni = i + d[0];
int nj = j + d[1];
if (ni < 0 || ni > r - 1 || nj < 0 || nj > c - 1 || map[ni][nj] == '.' || seen[ni][nj]) {
continue;
}
seen[ni][nj] = true;
qu.add(new int[] { ni, nj, si, sj });
}
}
}
return safe;
}
}