#include <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;
using ll = long long;
template <ll M>
struct modular {
ll val;
// n >= 0
modular(const ll n) {
if (n < M)
val = n;
else if (n < 2 * M)
val = n - M;
else
val = n % M;
}
[[nodiscard]] modular operator +(const modular& rhs) const {
return val + rhs.val;
}
[[nodiscard]] modular operator -(const modular& rhs) const {
return val + M - rhs.val;
}
[[nodiscard]] modular operator *(const modular& rhs) const {
return val * rhs.val;
}
// p >= 0
[[nodiscard]] modular pow(const ll& p) const {
if (p == 0)
return 1;
if (p % 2 == 0)
return (*this * *this).pow(p / 2);
else
return *this * pow(p - 1);
}
[[nodiscard]] modular inv() const {
return pow(M - 2);
}
[[nodiscard]] modular operator /(const modular& rhs) const {
return *this * rhs.inv();
}
modular& operator +=(const modular& rhs) {
return *this = *this + rhs;
}
modular& operator -=(const modular& rhs) {
return *this = *this - rhs;
}
modular& operator *=(const modular& rhs) {
return *this = *this * rhs;
}
modular& operator /=(const modular& rhs) {
return *this = *this / rhs;
}
explicit operator ll() const {
return val;
}
};
template <ll M>
ostream& operator<<(ostream& os, const modular<M>& modular) {
cout << modular.val;
return os;
}
using mod = modular<ll(1e14) + 39>;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll n, m;
cin >> n >> m;
mod fp = 1;
for (int i = 0; i < m - 1; i++)
fp *= 31;
map<ll, ll> hashes;
ll ans = 0;
for (int w = 0; w < n; w++) {
string s;
cin >> s;
mod cur_hash = 0;
for (char const& c : s) {
cur_hash *= 31;
cur_hash += c - 'a' + 1;
}
ans += hashes[ll(cur_hash)];
set<ll> cur_hashes;
cur_hashes.insert(ll(cur_hash));
for (int i = 0; i < m - 1; i++) {
cur_hash -= fp * (s[i] - 'a' + 1);
cur_hash *= 31;
cur_hash += (s[i] - 'a' + 1);
cur_hashes.insert(ll(cur_hash));
}
for (ll const h : cur_hashes)
hashes[ll(h)]++;
}
cout << ans << "\n";
}