#include #include #include using namespace std; static bool table[26][26]; static char s[27]; static int d[26]; void tsort(int n, int k) { if(k == n) { s[n] = '\0'; cout << s << endl; return; } for(int i = 0; i < 26; i++) { if(d[i] == 1) { s[k] = (char)(i + 'A'); for(int j = 0; j < 26; j++) if(table[j][i]) --d[j]; tsort(n, k + 1); for(int j = 0; j < 26; j++) if(table[j][i]) ++d[j]; } } } int main(void) { ifstream cin("frame.txt"); int state[30][30]; int xmin[26], xmax[26], ymin[26], ymax[26]; int h, w; while(cin >> h >> w) { if(h == 0 && w == 0) break; for(int i = 0; i < 26; i++) { xmin[i] = w; xmax[i] = 0; ymin[i] = h; ymax[i] = 0; } for(int y = 0; y < h; y++) { for(int x = 0; x < w; x++) { char c; cin >> c; int m = c - 'A'; state[x][y] = m; if(c == '.') continue; if(x < xmin[m]) xmin[m] = x; if(x > xmax[m]) xmax[m] = x; if(y < ymin[m]) ymin[m] = y; if(y > ymax[m]) ymax[m] = y; } } for(int i = 0; i < 26; i++) { for(int j = 0; j < 26; j++) { table[i][j] = false; } } for(int i = 0; i < 26; i++) { if(xmin[i] > xmax[i]) continue; for(int x = xmin[i]; x <= xmax[i]; x++) { table[state[x][ymin[i]]][i] = true; table[state[x][ymax[i]]][i] = true; } for(int y = ymin[i]; y <= ymax[i]; y++) { table[state[xmin[i]][y]][i] = true; table[state[xmax[i]][y]][i] = true; } } int n = 0; for(int i = 0; i < 26; i++) { if(xmin[i] > xmax[i]) { d[i] = -1; } else { d[i] = 0; // Note that table[i][i] is always true for(int j = 0; j < 26; j++) if(table[i][j]) ++d[i]; ++n; } } tsort(n, 0); cout << endl; } return 0; }