#include #define MAXM 32 int map[MAXM][MAXM], h, w; char chs[32]; int chc; int pred[32][32]; int minx[32], maxx[32], miny[32], maxy[32]; int res[32], resc; int char2num (char ch) { int i; for ( i = 0; i < chc; ++i ) if ( chs[i] == ch ) return i; chs[chc] = ch; minx[chc] = miny[chc] = w + h; maxx[chc] = maxy[chc] = 0; return chc++; } void readit (void) { int i, j, c; char buf[MAXM]; chc = 0; char2num ('.'); for ( i = 0; i < h; ++i ) { scanf ("%s", buf); for ( j = 0; j < w; ++j ) { c = map[i][j] = char2num (buf[j]); if ( i < minx[c] ) minx[c] = i; if ( i > maxx[c] ) maxx[c] = i; if ( j < miny[c] ) miny[c] = j; if ( j > maxy[c] ) maxy[c] = j; } } } void checkfld (int c, int i, int j) { if ( map[i][j] != c ) ++pred[c][map[i][j]]; } void fillpred (void) { int i, j; for ( i = 0; i < chc; ++i ) for ( j = 0; j < chc; ++j ) pred[i][j] = 0; for ( i = 0; i < chc; ++i ) { for ( j = minx[i]; j <= maxx[i]; ++j ) { checkfld (i, j, miny[i]); checkfld (i, j, maxy[i]); } for ( j = miny[i]; j <= maxy[i]; ++j ) { checkfld (i, minx[i], j); checkfld (i, maxx[i], j); } } } int inres (int n) { int i; for ( i = 0; i < resc; ++i ) if ( res[i] == n ) return 1; return 0; } void genres (void) { int i, j, cnt; if ( resc == chc-1 ) { for ( i = resc; --i >= 0; ) putchar (chs[res[i]]); putchar ('\n'); return; } for ( i = 1; i < chc; ++i ) if ( !inres (i) ) { cnt = 0; for ( j = 1; j < chc; ++j ) if ( j != i && !inres (j) ) if ( pred[i][j] ) ++cnt; if ( !cnt ) { res[resc++] = i; genres(); --resc; } } } int main (void) { for ( ; ; ) { scanf ("%d%d", &h, &w); if ( !h || !w ) break; readit(); fillpred(); resc = 0; genres(); } return 0; }