OI XVII - cho

// https://szkopul.edu.pl/problemset/problem/mLv0a_y18C5vj5J6jFK2gbwr/site/?key=statement

// Chomiki

#include <bits/stdc++.h>

// using namespace std;

// #define GARY_DBG
#define GARY_LIB

// #define int long long

constexpr int sizik = 203;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

int n, m;

// Returns the length of the longest proper prefix of s
// which is also a suffix (excluding the whole string)
int maxPrefixSuffix(const std::string& s) {
    int n = s.size();
    std::vector<int> lps(n, 0); // longest prefix-suffix array

    for (int i = 1, len = 0; i < n;) {
        if (s[i] == s[len]) {
            lps[i++] = ++len;
        } else {
            if (len != 0) {
                len = lps[len - 1];
            } else {
                lps[i++] = 0;
            }
        }
    }

    int ans = lps[n - 1];
    // make sure we don't take the whole string
    if (ans == n) ans = lps[ans - 1];
    return ans;
}

constexpr int64_t INF = INT64_MAX;
using Z = std::vector<std::vector<int64_t>>;

// int T1[sizik][sizik];
Z T1;

std::string s[sizik];

Z op(const Z& m1, const Z& m2) {
    Z ret;
    ret.resize(n, std::vector<int64_t>(n, INF));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                ret[i][j] = std::min(ret[i][j], m1[i][k] + m2[k][j]);
            }
        }
    }
    return ret;
}

Z calc(int x) {
    if (x == 1) return T1;
    assert(x > 1);
    if (x % 2 == 0) {
        auto t = calc(x / 2);
        return op(t, t);
    } else {
        auto t = calc(x - 1);
        return op(T1, t);
    }
}

void solve() {
    // calculate these stuff..

    std::cin >> n >> m;

    T1.resize(n, std::vector<int64_t>(n, 0));

    // input
    for (int i = 1; i <= n; i++) {
        std::cin >> s[i];
    }

    if (m == 1) {
        int64_t ans = INF;
        for (int i = 1; i <= n; i++) {
            ans = std::min(ans, (int64_t)s[i].size());
        }
        std::cout << ans << '\n';
        return;
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            std::string helper;
            if (i == j) {
                helper = s[i];
            } else {
                helper = s[j] + "#" + s[i];
            }
            int o = maxPrefixSuffix(helper);
            o = s[i].size() - o;
            T1[i - 1][j - 1] = o;
        }
    }

    // calc matrix
    auto final_matrix = calc(m - 1);

    int64_t ans = INF;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            ans = std::min(ans, final_matrix[i][j] + (int64_t)s[j + 1].size());
        }
    }

    std::cout << ans << '\n';
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}