#include <bits/stdc++.h>
#pragma GCC optimize("O3")
inline bool setmin(int &x, int y) { return (y < x) ? x = y, 1 : 0; }
inline bool setmax(int &x, int y) { return (y > x) ? x = y, 1 : 0; }
inline bool setmin(long long &x, long long y) { return (y < x) ? x = y, 1 : 0; }
inline bool setmax(long long &x, long long y) { return (y > x) ? x = y, 1 : 0; }
using namespace std;
vector<string> c;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.precision(20);
  int n, k;
  cin >> n >> k;
  c.resize(n);
  for (int i = (0); i < (n); ++i) cin >> c[i];
  sort(c.begin(), c.end());
  long long ans = 0;
  for (int i = (0); i < (n); ++i) {
    string p = c[i];
    for (int j = (i + 1); j < (n); ++j) {
      string q = c[j];
      string r = "";
      for (int m = (0); m < (k); ++m) {
        if (p[m] == q[m])
          r += q[m];
        else
          r += 'E' + 'T' + 'S' - p[m] - q[m];
      }
      int l = lower_bound(c.begin(), c.end(), r) - c.begin();
      if (l > j && l < n && c[l] == r) ans++;
    }
  }
  cout << ans << '\n';
  return 0;
}
