#include #include #include #include #include #include #include #include #include #include using namespace std; ifstream fin("frame.txt"); #define cin fin struct rect { int l, d, r, u; rect() { l = d = INT_MAX; r = u = INT_MIN; } }; typedef vector > field; typedef map > graph; void scan_x(int l, const int y, const int r, const char name, const field& p, graph& g) { for(; l <= r; l++) if(p[y][l] != name) g[name].insert(p[y][l]); } void scan_y(const int x, int d, const int u, const char name, const field& p, graph& g) { for(; d <= u; d++) if(p[d][x] != name) g[name].insert(p[d][x]); } int level = 0; void rec(vector& result, /*const*/graph& g) { if(g.empty()) { result.push_back(""); if(result.size() > 1000) abort(); } for(graph::iterator it = g.begin(); it != g.end(); ++it) { bool minimum = true; for(char c = 'A'; c <= 'Z' && minimum; ++c) if(g.count(c) && g[c].count(it->first)) minimum = false; if(minimum) { //cout << "level " << level << ", selected " << it->first << endl; graph cg = g; cg.erase(it->first); int now = result.size(); level++; rec(result, cg); --level; for(; now < result.size(); now++) result[now] = it->first + result[now]; } } } void solve(field& p) { map area; for(int i = 0; i < p.size(); i++) { const vector& v = p[i]; for(int j = 0; j < v.size(); j++) { if(v[j] == '.') continue; rect& r = area[v[j]]; r.l = min(j, r.l); r.r = max(j, r.r); r.d = min(i, r.d); r.u = max(i, r.u); } } graph g; for(map::const_iterator it = area.begin(); it != area.end(); ++it) { const char name = it->first; const rect& r = it->second; g[name]; scan_x(r.l, r.d, r.r, name, p, g); scan_y(r.r, r.d, r.u, name, p, g); scan_x(r.l, r.u, r.r, name, p, g); scan_y(r.l, r.d, r.u, name, p, g); } vector result; rec(result, g); sort(result.begin(), result.end()); for(int i = 0; i < result.size(); i++) cout << result[i] << endl; cout << endl; } int main() { if(!fin) return -1; int h, w; while(cin >> h >> w, h || w) { field prob(h, vector(w, '.')); for(int i = 0; i < h; i++) for(int j = 0; j < w; j++) cin >> prob[i][j]; solve(prob); } return 0; }