#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <cstring>
#include <fstream>
#include <string>
#include <algorithm>
#define INF 1000000000
#define ll long long
using namespace std;
int h,w;
string arr[1010];
bool visit[1010][1010];
int stateCount[26];
struct stateInfo{
int count;
int name;
};
vector<stateInfo> vb;
bool cmp(stateInfo a,stateInfo b)
{
if(a.count!=b.count)
return a.count>b.count;
else
return a.name<b.name;
}
void findSet(int a,int b)
{
char c = arr[a][b];
int x,y;
queue<int> cue;
cue.push(a);
cue.push(b);
visit[a][b]=1;
while(!cue.empty())
{
x = cue.front();cue.pop();
y = cue.front();cue.pop();
if(x+1<h && arr[x+1][y]==c && visit[x+1][y]==0)
{
visit[x+1][y]=1;
cue.push(x+1);
cue.push(y);
}
if(x-1>=0 && arr[x-1][y]==c && visit[x-1][y]==0)
{
visit[x-1][y]=1;
cue.push(x-1);
cue.push(y);
}
if(y+1<w && arr[x][y+1]==c && visit[x][y+1]==0)
{
visit[x][y+1]=1;
cue.push(x);
cue.push(y+1);
}
if(y-1>=0 && arr[x][y-1]==c && visit[x][y-1]==0)
{
visit[x][y-1]=1;
cue.push(x);
cue.push(y-1);
}
}
}
int main()
{
int t,kase=1;
scanf("%d",&t);
stateInfo tmp;
getchar();
while(t--)
{
cin>>h;
getchar();
cin>>w;
getchar();
vb.clear();
memset(visit,0,sizeof(visit));
memset(stateCount,0,sizeof(stateCount));
for(int i=0;i<h;i++)
{
getline(cin,arr[i]);
}
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(visit[i][j]==0)
{
findSet(i,j);
stateCount[arr[i][j]-'a']+=1;
}
}
}
cout<<"World #"<<kase++<<"\n";
for(int i=0;i<26;i++)
{
if(stateCount[i]!=0)
{
//cout<<char('a'+i)<<": "<<stateCount[i]<<"\n";
tmp.name = i;
tmp.count = stateCount[i];
vb.push_back(tmp);
}
}
sort(vb.begin(),vb.end(),cmp);
for(int i=0;i<vb.size();i++)
{
cout<<char(vb[i].name+'a')<<": "<<vb[i].count<<"\n";
}
}
return 0;
}