#include
#include
#define maxn 210
using namespace std;
int n,m;
int cnt;
int g[maxn][maxn];
char str[] = {'W','A','K','J','S','D'};
vectorans;
int s[16][4] = {
{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},
{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},
{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},
{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1},
};
//x 0~n+1
//y 0~m+1 种子填充
void dfs(int x,int y)
{
if(x>=0&&x<=(1+n)&&y>=0&&y<=(m+1)&&!g[x][y])
{
g[x][y] = -1;//非黑非白
for(int i = -1;i<2;i++)
for(int j = -1;j<2;j++)
dfs(x+i,y+j);
}
}
void dfs2(int x,int y)
{
if(x>=0&&x<=(1+n)&&y>=0&&y<=(m+1)&&g[x][y]!=-1)
{
if(g[x][y] == 0)
{
cnt++;
dfs(x,y);//填充
}
g[x][y] = -1;//g[x][y] = 1
for(int i = -1;i<2;i++)
for(int j = -1;j<2;j++)
dfs2(x+i,y+j);
}
}
int main()
{
char c;
int k;
int kase = 0;
while(cin>>n>>m&&n&&m)
{
kase++;
cnt = 0;
ans.clear();
memset(g,0,sizeof(g));
for(int i = 1;i<=n;i++)
{
for(int j = 0;j>c;
if(isdigit(c)) k = c-'0';
else k = c-'a'+10;
for(int l = 0;l<4;l++)
{
g[i][4*j+l+1] = s[k][l];
}
}
}
//dfs
m = m*4;
dfs(0,0);
for(int i = 0;i