/* (⊙v⊙)嗯 貌似是一个建图 拓扑+深搜的过程。至于为什么要深搜嘛。。一个月前敲得题现在全部推了重敲,于是明白了。因为题意要求如果有多个可能的解的话。
* 就要输出字典序最小的那个。所以可以对26个英文字母从小到大尝试能否排出结果。于是出现了 深搜回溯。先选定入度为0的边框。标记为已用。将所有与它连通的
* 边框入度减一。然后递归搜索下一个。此时开始回溯。当前边框标记为未用,所有与它连通的边框入度加1.
* 建图的过程则是。对每一个字母的边框测量出来。然后对A里的其它字母B。(B 覆盖 A)。有关系 map[A][B] = *1。in[B]++;
*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 27
int map[maxn+5][maxn+5]; //建的图
char m[35][35]; //输入
int h, w; // 输入size
int tot; //有多少种字母边框
int in[maxn]; //每种字母对应的入度。
char ans[maxn]; // 存储答案
bool flag;
struct Node // 存储每个字母对应的边框边界
{
int lo, hi;
int le, ri;
}node[maxn+5];
void buildmap()
{
for (int i=0; i<h; ++i) // 测量边界
{
for (int j=0; j<w; ++j)
{
if (m[i][j] == '.')
continue;
int temp = m[i][j] - 'A';
if (in[temp] == -1)
{
in[temp] = 0;
tot++;
}
if (i > node[temp].hi) node[temp].hi = i;
if (i < node[temp].lo) node[temp].lo = i;
if (j < node[temp].le) node[temp].le = j;
if (j > node[temp].ri) node[temp].ri = j;
}
}
for (int k=0; k<maxn; ++k) //建图
{
if (in[k] == -1)
continue;
for (int i=node[k].lo; i<=node[k].hi; ++i)
{
for (int j=node[k].le; j<=node[k].ri; ++j)
{
if (i>node[k].lo && i<node[k].hi && j>node[k].le && j<node[k].ri)
continue;
int temp = m[i][j] - 'A';
if (k != temp && !map[k][temp])
{
map[k][temp] = 1;
in[temp] += 1;
}
}
}
}
}
int hh = 0;
void dfs(int num)
{
if (num == tot)
{
ans[num] = '\0';
cout << ans << endl;
return;
}
//觉得应该会有字典序不同的答案。所以在输出加上判断。然而。wa了。应该是递归没有理解清楚。
// if (num == tot && flag)
// {
// ans[num] = '\0';
// puts(ans);
// flag = false;
// return;
// }
for (int i=0; i<maxn; ++i)
{
if (in[i] == 0)
{
ans[num] = i + 'A';
in[i] = -1;
for (int j=0; j<maxn; j++)
{
if (map[i][j])
in[j] -= 1;
}
dfs(num+1);
in[i] = 0;
for (int j=0; j<maxn; ++j)
{
if (map[i][j])
in[j] += 1;
}
}
}
return;
}
int main()
{
while (scanf("%d%d", &h, &w) == 2)
{
tot = 0;
memset(in, -1, sizeof(in));
memset(map, 0, sizeof(map));
flag = true;
for (int i=0; i<maxn+5; ++i)
{
node[i].lo = 100;
node[i].le = 100;
node[i].hi = -1;
node[i].ri = -1;
}
for (int i=0; i<h; ++i)
{
scanf("%s", m[i]);
}
buildmap();
dfs(0);
}
return 0;
}