#include <bits/stdc++.h>
using namespace std;
void _print(int t) { cerr << t; }
void _print(string t) { cerr << t; }
void _print(char t) { cerr << t; }
void _print(long double t) { cerr << t; }
void _print(double t) { cerr << t; }
void _print(unsigned long long t) { cerr << t; }
template <class T, class V>
void _print(pair<T, V> p);
template <class T>
void _print(vector<T> v);
template <class T>
void _print(set<T> v);
template <class T, class V>
void _print(map<T, V> v);
template <class T>
void _print(multiset<T> v);
template <class T, class V>
void _print(pair<T, V> p) {
  cerr << "{";
  _print(p.first);
  cerr << ",";
  _print(p.second);
  cerr << "}";
}
void solve() {
  int n, k;
  cin >> n >> k;
  string A[n];
  map<string, int> m;
  for (int i = (0); i < (n); i++) {
    cin >> A[i];
    m[A[i]]++;
  }
  long long ans = 0;
  sort(A, A + n);
  set<string> st;
  for (int i = (0); i < (n - 2); i++) {
    for (int j = (i + 1); j < (n - 1); j++) {
      string s(k, '.');
      for (int z = (0); z < (k); z++) {
        if (A[i][z] == A[j][z]) {
          s[z] = A[i][z];
        } else {
          int tmp = A[i][z] + A[j][z];
          if (tmp == 152) {
            s[z] = 'T';
          } else if (tmp == 153) {
            s[z] = 'S';
          } else {
            s[z] = 'E';
          }
        }
      }
      string tmp = A[i] + A[j] + s;
      if (s.compare(A[i]) >= 0 && s.compare(A[j]) >= 0 &&
          st.find(tmp) == st.end()) {
        ans += m[s];
        if (s.compare(A[i]) == 0) {
          ans--;
        }
        if (s.compare(A[j]) == 0) {
          ans--;
        }
        st.insert(tmp);
      }
    }
  }
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int tt = 1;
  while (tt--) {
    solve();
  }
  return 0;
}
