#include<iostream>
#include<vector>
#define MAXN 100000
#define MAXK 10
#define SIGMA 26
using namespace std;
struct node {
    int to[SIGMA];
    int maxl;
    int link;
};
int num=1,last=0;
node sa[2*(MAXK*2*MAXN)-1];
int add_node (int maxl) {
    sa[num].maxl=maxl;
    return num++;
}
int add_node (int maxl, node tmp) {
    sa[num]=move(tmp);
    return add_node(maxl);
}
int clone_node (int curr, int nxt, int c) {
    int clone=add_node(sa[curr].maxl+1,sa[nxt]);
    sa[nxt].link=clone;
    while ((curr!=-1)&&(sa[curr].to[c]==nxt)) {
        sa[curr].to[c]=clone;
        curr=sa[curr].link;
    }
    return clone;
}
void add_letter (int c) {
    int nxt=sa[last].to[c];
    if (nxt!=0) {
        if (sa[last].maxl+1==sa[nxt].maxl) last=nxt;
        else {
            int clone=clone_node(last,nxt,c);
            last=clone;
        }
        return ;
    }
    int curr=last;
    last=add_node(sa[last].maxl+1);
    while ((curr!=-1)&&(sa[curr].to[c]==0)) {
        sa[curr].to[c]=last;
        curr=sa[curr].link;
    }
    if (curr==-1) {
        sa[last].link=0;
        return ;
    }
    nxt=sa[curr].to[c];
    if (sa[curr].maxl+1==sa[nxt].maxl) sa[last].link=nxt;
    else {
        int clone=clone_node(curr,nxt,c);
        sa[last].link=clone;
    }
}
void add_letter (char c) {
    add_letter(c-'a');
}

int mask[2*(MAXK*2*MAXN)-1];
vector <int> sorted[2*MAXN+1];
int main () {
    ios_base::sync_with_stdio(false);
    int n,k;
    cin >> n >> k ;
    sa[0].maxl=0;
    sa[0].link=-1;
    for (int i=0; i<k; i++) {
        string s;
        cin >> s ;
        last=0;
        mask[last]|=(1<<i);
        for (auto c : s) {
            add_letter(c);
            mask[last]|=(1<<i);
        }
        for (auto c : s) {
            add_letter(c);
            mask[last]|=(1<<i);
        }
    }
    for (int i=0; i<num; i++) {
        sorted[sa[i].maxl].push_back(i);
    }
    int max1=0;
    for (int len=2*n; len>=1; len--) {
        for (auto ind : sorted[len]) {
            if (mask[ind]==(1<<k)-1) {
                max1=len;
                if (max1>n) max1=n;
                break;
            }
            mask[sa[ind].link]|=mask[ind];
        }
        if (max1!=0) break;
    }
    cout << max1 ;
    cout << endl ;
    return 0;
}
