#include <bits/stdc++.h>
using namespace std;

// region template
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define trav(a, x) for (auto &a : x)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

ll gcd(ll a, ll b) { return __gcd(a, b); }

ll euclid(ll a, ll b, ll &x, ll &y) {
    if (b) { ll d = euclid(b, a % b, y, x);
        return y -= a/b * x, d; }
    return x = 1, y = 0, a;
}

typedef unsigned long long ull;
typedef long double ld;
ull mod_mul(ull a, ull b, ull M) {
    ll ret = a * b - M * ull(ld(a) * ld(b) / ld(M));
    return ret + M * (ret < 0) - M * (ret >= (ll)M);
}
ull mod_pow(ull b, ull e, ull mod) {
    ull ans = 1;
    for (; e; b = mod_mul(b, b, mod), e /= 2)
        if (e & 1) ans = mod_mul(ans, b, mod);
    return ans;
}

const ll mod = 1000000007;
struct Mod {
    ll x;
    Mod(ll xx) : x(xx) {}
    Mod operator+(Mod b) { return Mod((x + b.x) % mod); }
    Mod operator-(Mod b) { return Mod((x - b.x) % mod); }
    Mod operator*(Mod b) { return Mod((x * b.x) % mod); }
    Mod operator/(Mod b) { return *this * invert(b); }
    Mod invert(Mod a) {
        ll x, y, g = euclid(a.x, mod, x, y);
        assert(g == 1); return Mod((x + mod) % mod);
    }
    Mod operator^(ll e) {
        if (!e) return Mod(1);
        Mod r = *this ^ (e / 2); r = r * r;
        return e & 1 ? *this * r : r;
    }
};
// endregion

int n, m;
string grid[20];
map<string, int> mp;

void gen2(string s) {
    int l = s.length();
    rep(i, 0, l) {
        string k;
        rep(j, 0, l) {
            k += s[(i + j) % l];
            if (k.size() > 1) mp[k]++;
        }
    }
}

void gen(string s) {
    gen2(s);
    reverse(s.begin(), s.end());
    gen2(s);
}

int main() {
    for (;;) {
        cin >> n >> m; if (!n) break;
        mp.clear();

        for (int i = 0; i < n; i++) {
            cin >> grid[i];
        }

        for (int i = 0; i < n; i++) {
            string buf;
            for (int j = 0; j < m; j++) {
                buf += grid[i][j];
            }
            // cout << buf << endl;
            gen(buf);
        }

        for (int j = 0; j < m; j++) {
            string buf;
            for (int i = 0; i < n; i++) {
                buf += grid[i][j];
            }
            // cout << buf << endl;
            gen(buf);
        }

        int g = __gcd(n, m);
        for (int a = 0; a < g; a++) {
            string buf;
            for (int b = 0, i = a, j = 0; b < n * m / g; ++b, ++i %= n, ++j %= m) {
                buf += grid[i][j];
            }
            // cout << buf << endl;
            gen(buf);
        }
        for (int a = 0; a < g; a++) {
            string buf;
            for (int b = 0, i = a, j = 0; b < n * m / g; ++b, ++i %= n, j = (j + m - 1) % m) {
                buf += grid[i][j];
            }
            // cout << buf << endl;
            gen(buf);
        }

        string best = "";
        for (auto p : mp) {
            if (p.second >= 2 && (p.first.size() > best.size() || p.first.size() == best.size() && p.first < best)) {
                best = p.first;
            }
        }
        cout << (best.size() ? best.c_str() : "0") << endl;
    }
}


Measured memory_bytes: 38008