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

void dicch(vector<string> d){
    vector<map<string,int>> lis(1);
    vector<string> ans;
    map<string, int> mp;
    lis.push_back(mp);
    int maxl=1,leng=1;
    for(string x:d){
        if(x.size()>=maxl){
            if(x.size()>leng){
                leng=x.size();
                lis.resize(leng);
                map<string,int> tmp;
                tmp[x]=1;
                lis.push_back(tmp);
            }
            else{
                if( lis[x.size()-1].find(x)!=lis[x.size()-1].end() ){
                    if(x.size()>maxl){
                        ans.clear();
                        maxl=x.size();
                    }
                    ans.push_back(x);
                }
                else{
                    lis[x.size()-1][x]=1;
                }
            }
        }
    }
    sort(ans.begin(),ans.end());
    cout << ((ans.empty())?"0":*ans.begin())<<endl;
}

void dicmk(vector<string> d){
    vector<string> pass;
    for(string x:d){
        string xx=x+x;
        for(int i=2;i<=x.size();i++){
            for(int j=0;j<x.size();j++){
                string str=xx.substr(j,i);
                pass.push_back(str);
            }
        }
    }
    dicch(pass);
}


void check(vector<vector<char>> d,int h,int w){
    vector<string> dic;
    int x,y;
    for(int i=0;i<w;i++){
        string str;
        for(int j=0;j<h;j++){
            str.push_back(d[j][i]);
        }
        dic.push_back(str);
    }
    for(int i=0;i<h;i++){
        string str;
        for(int j=0;j<w;j++){
            str.push_back(d[i][j]);
        }
        dic.push_back(str);
    }
    vector<bool> s1(w,true);
    for(int i=0;i<w;i++){
        if(s1[i]){
            string str;
            x=i;
            y=0;
            str.push_back(d[y][x]);
            x+=1;x=(x+w)%w;
            y+=1;y=(y+h)%h;
            while(!(x==i&&y==0)){
                if(y==0){
                    s1[x]=false;
                }
                str.push_back(d[y][x]);
                x+=1;x=(x+w)%w;
                y+=1;y=(y+h)%h;
            }
            dic.push_back(str);
        }
    }
    vector<bool> s2(w,true);
    for(int i=0;i<w;i++){
        if(s2[i]){
            string str;
            x=i;
            y=0;
            str.push_back(d[y][x]);
            x-=1;x=(x+w)%w;
            y+=1;y=(y+h)%h;
            while(!(x==i&&y==0)){
                if(!y){
                    s2[x]=false;
                }
                str.push_back(d[y][x]);
                x-=1;x=(x+w)%w;
                y+=1;y=(y+h)%h;
            }
            dic.push_back(str);
        }
    }
    int siz=dic.size();
    for(int i=0;i<siz;i++){
        string rev=dic[i];
        reverse(rev.begin(), rev.end());
        dic.push_back(rev);
    }
    dicmk(dic);
}

void slove(int h,int w){
    vector<vector<char>> d; 
    char t;
    for(int i=0;i<h;i++){
        vector<char> tmp;
        for(int j=0;j<w;j++){
            cin >> t;
            tmp.push_back(t);
        }
        d.push_back(tmp);
    }
    check(d,h,w);
}


int main(void){
    int h,w;
    while(cin>>h>>w,h){
        slove(h,w);
    }
}

Measured memory_bytes: 33244