#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define inf 1000000000000000LL
#define mod 1000000007LL
#define FOR(i,a,b) for(int i = a; i < b; i++)
const ll Mod = 1'000'000'000'000'000'003LL;
const ll Base = 257LL;
ll mul(ll a, ll b){
__int128_t v = a;
return (v * b % Mod);
}
struct hashed_string{
private:
string s; ll n;
const int N = 2000;
vector <ll> prefix;
vector <ll> pow;
public:
hashed_string(string a){
s = a; n = a.size();
prefix.assign(n, 0);
ll sum = 0;
pow.assign(n+1, 0);
pow[0] = 1;
for (int i = 1; i <= n; i++){
pow[i] = mul(pow[i-1], Base);
}
for (int i = 0; i < n; i++){
prefix[i] = (mul(sum, Base) + (s[i] == '*' ? 1 : 2)) % Mod;
sum = prefix[i];
}
}
hashed_string(){
n = 0;
pow.assign(N+1, 0);
pow[0] = 1;
for (int i = 1; i <= N; i++){
pow[i] = mul(pow[i-1], Base);
}
}
void addhash(ll a){
ll cur = a % Mod;
if (n > 0) cur = (mul(prefix.back(), Base) + cur) % Mod;
prefix.push_back(cur);
n++;
}
ll get_hash(ll l, ll r){
ll x = prefix[r];
if (l >= 1){
x = (((x - mul(prefix[l-1], pow[r - l+1]))% Mod) % Mod + Mod) % Mod;
}
return x;
}
};
void solve() {
ll n,m;
cin >> n >> m;
vector <string> l1(n);
vector <hashed_string> hashed_list;
FOR(i,0,n){
cin >> l1[i];
}
vector <string> l2;
for (int i = 0; i < n; i++){
l1[i] += l1[i];
}
l2 = l1;
l1.insert(l1.end(), l2.begin(), l2.end());
for (int i = 0; i < 2 * n; i++){
hashed_list.emplace_back(l1[i]);
}
vector <hashed_string> prefix(m + 1);
for (int i = 0; i < m + 1; i++){
for (int j = 0; j < 2 * n; j++){
prefix[i].addhash(hashed_list[j].get_hash(i, i + m - 1));
}
}
pair <ll,ll> pos = {-1,-1};
auto flag = [&](ll x, ll y, ll lim)->bool{
ll whole = lim / m;
if (whole >= 1){
if (prefix[y].get_hash(x, x + whole - 1) != prefix[pos.second].get_hash(pos.first, pos.first + whole - 1)){
return false;
}
}
ll ones = lim % m;
if (ones >= 1){
if(hashed_list[x + whole].get_hash(y, y + ones - 1) != hashed_list[pos.first + whole].get_hash(pos.second, pos.second + ones - 1)){
return false;
}
}
return true;
};
auto getchar = [&](ll x, ll y, ll val){
ll whole = val / m; ll ones = val % m;
if (ones == 0){
return l1[x + whole - 1][y + m - 1];
}
else{
return l1[x + whole][y + ones - 1];
}
};
for (int i = 0; i < n + 1; i++){
for (int j = 0; j < m + 1; j++){
if (i == 0 && j == 0){
pos = {i,j}; continue;
}
ll lo = 1;
ll hi = n * m;
while (lo != hi){
ll mid = (lo + hi+ 1) / 2;
if (flag(i,j,mid)){
lo = mid;
}
else{
hi = mid - 1;
}
}
if (flag(i,j,lo)){
if (hi != n * m && getchar(i, j, lo + 1) < getchar(pos.first, pos.second, lo + 1)){
pos = {i,j};
}
}
else{
if (getchar(i,j,1) < getchar(pos.first, pos.second, 1)){
pos = {i,j};
}
}
}
}
for (int i = pos.first; i < pos.first + n; i++){
for (int j = pos.second; j < pos.second + m; j++){
cout << l1[i][j];
}
cout << "\n";
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll t = 1;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nIGludDsKI2RlZmluZSBpbmYgMTAwMDAwMDAwMDAwMDAwMExMCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDdMTAojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpID0gYTsgaSA8IGI7IGkrKykKY29uc3QgbGwgTW9kID0gMScwMDAnMDAwJzAwMCcwMDAnMDAwJzAwM0xMOwpjb25zdCBsbCBCYXNlID0gMjU3TEw7CmxsIG11bChsbCBhLCBsbCBiKXsKICAgIF9faW50MTI4X3QgdiA9IGE7CiAgICByZXR1cm4gKHYgKiBiICUgTW9kKTsKfQpzdHJ1Y3QgaGFzaGVkX3N0cmluZ3sgICAKICAgIHByaXZhdGU6CiAgICBzdHJpbmcgczsgbGwgbjsKICAgIGNvbnN0IGludCBOID0gMjAwMDsKICAgIHZlY3RvciA8bGw+IHByZWZpeDsKICAgIHZlY3RvciA8bGw+IHBvdzsKICAgIHB1YmxpYzoKICAgIGhhc2hlZF9zdHJpbmcoc3RyaW5nIGEpewogICAgICAgIHMgPSBhOyBuID0gYS5zaXplKCk7CiAgICAgICAgcHJlZml4LmFzc2lnbihuLCAwKTsKICAgICAgICBsbCBzdW0gPSAwOwogICAgICAgIHBvdy5hc3NpZ24obisxLCAwKTsKICAgICAgICBwb3dbMF0gPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgICAgIHBvd1tpXSA9IG11bChwb3dbaS0xXSwgQmFzZSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICAgICAgcHJlZml4W2ldID0gKG11bChzdW0sIEJhc2UpICsgKHNbaV0gPT0gJyonID8gMSA6IDIpKSAlIE1vZDsKICAgICAgICAgICAgc3VtID0gcHJlZml4W2ldOwogICAgICAgIH0KICAgIH0KICAgIGhhc2hlZF9zdHJpbmcoKXsKICAgICAgICBuID0gMDsKICAgICAgICBwb3cuYXNzaWduKE4rMSwgMCk7CiAgICAgICAgcG93WzBdID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyBpKyspewogICAgICAgICAgICBwb3dbaV0gPSBtdWwocG93W2ktMV0sIEJhc2UpOwogICAgICAgIH0KICAgIH0KICAgIHZvaWQgYWRkaGFzaChsbCBhKXsKICAgICAgICBsbCBjdXIgPSBhICUgTW9kOwogICAgICAgIGlmIChuID4gMCkgY3VyID0gKG11bChwcmVmaXguYmFjaygpLCBCYXNlKSArIGN1cikgJSBNb2Q7CiAgICAgICAgcHJlZml4LnB1c2hfYmFjayhjdXIpOwogICAgICAgIG4rKzsKICAgIH0KICAgIGxsIGdldF9oYXNoKGxsIGwsIGxsIHIpewogICAgICAgIGxsIHggPSBwcmVmaXhbcl07CiAgICAgICAgaWYgKGwgPj0gMSl7CiAgICAgICAgICAgIHggPSAoKCh4IC0gbXVsKHByZWZpeFtsLTFdLCBwb3dbciAtIGwrMV0pKSUgTW9kKSAlIE1vZCArIE1vZCkgJSBNb2Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB4OwogICAgfQp9Owp2b2lkIHNvbHZlKCkgewogICAgbGwgbixtOwogICAgY2luID4+IG4gPj4gbTsKICAgIHZlY3RvciA8c3RyaW5nPiBsMShuKTsKICAgIHZlY3RvciA8aGFzaGVkX3N0cmluZz4gaGFzaGVkX2xpc3Q7CiAgICBGT1IoaSwwLG4pewogICAgICAgIGNpbiA+PiBsMVtpXTsKICAgIH0KICAgIHZlY3RvciA8c3RyaW5nPiBsMjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICBsMVtpXSArPSBsMVtpXTsKICAgIH0KICAgIGwyID0gbDE7CiAgICBsMS5pbnNlcnQobDEuZW5kKCksIGwyLmJlZ2luKCksIGwyLmVuZCgpKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMiAqIG47IGkrKyl7CiAgICAgICAgaGFzaGVkX2xpc3QuZW1wbGFjZV9iYWNrKGwxW2ldKTsKICAgIH0KICAgIHZlY3RvciA8aGFzaGVkX3N0cmluZz4gcHJlZml4KG0gKyAxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbSArIDE7IGkrKyl7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyICogbjsgaisrKXsKICAgICAgICAgICAgcHJlZml4W2ldLmFkZGhhc2goaGFzaGVkX2xpc3Rbal0uZ2V0X2hhc2goaSwgaSArIG0gLSAxKSk7CiAgICAgICAgfQogICAgfQogICAgcGFpciA8bGwsbGw+IHBvcyA9IHstMSwtMX07CiAgICBhdXRvIGZsYWcgPSBbJl0obGwgeCwgbGwgeSwgbGwgbGltKS0+Ym9vbHsKICAgICAgICBsbCB3aG9sZSA9IGxpbSAvIG07CiAgICAgICAgaWYgKHdob2xlID49IDEpewogICAgICAgICAgICBpZiAocHJlZml4W3ldLmdldF9oYXNoKHgsIHggKyB3aG9sZSAtIDEpICE9IHByZWZpeFtwb3Muc2Vjb25kXS5nZXRfaGFzaChwb3MuZmlyc3QsIHBvcy5maXJzdCArIHdob2xlIC0gMSkpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxsIG9uZXMgPSBsaW0gJSBtOwogICAgICAgIGlmIChvbmVzID49IDEpewogICAgICAgICAgICBpZihoYXNoZWRfbGlzdFt4ICsgd2hvbGVdLmdldF9oYXNoKHksIHkgKyBvbmVzIC0gMSkgIT0gaGFzaGVkX2xpc3RbcG9zLmZpcnN0ICsgd2hvbGVdLmdldF9oYXNoKHBvcy5zZWNvbmQsIHBvcy5zZWNvbmQgKyBvbmVzIC0gMSkpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKICAgIGF1dG8gZ2V0Y2hhciA9IFsmXShsbCB4LCBsbCB5LCBsbCB2YWwpewogICAgICAgIGxsIHdob2xlID0gdmFsIC8gbTsgbGwgb25lcyA9IHZhbCAlIG07CiAgICAgICAgaWYgKG9uZXMgPT0gMCl7CiAgICAgICAgICAgIHJldHVybiBsMVt4ICsgd2hvbGUgLSAxXVt5ICsgbSAtIDFdOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICByZXR1cm4gbDFbeCArIHdob2xlXVt5ICsgb25lcyAtIDFdOwogICAgICAgIH0KICAgIH07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gKyAxOyBpKyspewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbSArIDE7IGorKyl7CiAgICAgICAgICAgIGlmIChpID09IDAgJiYgaiA9PSAwKXsKICAgICAgICAgICAgICAgIHBvcyA9IHtpLGp9OyBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsbCBsbyA9IDE7IAogICAgICAgICAgICBsbCBoaSA9IG4gKiBtOwogICAgICAgICAgICB3aGlsZSAobG8gIT0gaGkpewogICAgICAgICAgICAgICAgbGwgbWlkID0gKGxvICsgaGkrIDEpIC8gMjsKICAgICAgICAgICAgICAgIGlmIChmbGFnKGksaixtaWQpKXsKICAgICAgICAgICAgICAgICAgICBsbyA9IG1pZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgaGkgPSBtaWQgLSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmbGFnKGksaixsbykpewogICAgICAgICAgICAgICAgaWYgKGhpICE9IG4gKiBtICYmIGdldGNoYXIoaSwgaiwgbG8gKyAxKSA8IGdldGNoYXIocG9zLmZpcnN0LCBwb3Muc2Vjb25kLCBsbyArIDEpKXsKICAgICAgICAgICAgICAgICAgICBwb3MgPSB7aSxqfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgaWYgKGdldGNoYXIoaSxqLDEpIDwgZ2V0Y2hhcihwb3MuZmlyc3QsIHBvcy5zZWNvbmQsIDEpKXsKICAgICAgICAgICAgICAgICAgICBwb3MgPSB7aSxqfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSBwb3MuZmlyc3Q7IGkgPCBwb3MuZmlyc3QgKyBuOyBpKyspewogICAgICAgIGZvciAoaW50IGogPSBwb3Muc2Vjb25kOyBqIDwgcG9zLnNlY29uZCArIG07IGorKyl7CiAgICAgICAgICAgIGNvdXQgPDwgbDFbaV1bal07CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgIlxuIjsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGxsIHQgPSAxOwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=