#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// Satrlarni va ularning tartib raqamlarini saqlash uchun
struct Node {
string s;
int id;
};
bool compareNodes(const Node& a, const Node& b) {
return a.s < b.s;
}
// Bu yerda BIT (Fenwick Tree) yoki Segment Tree ishlatiladi
// 2D querylarni hal qilish uchun
int main() {
int N, M;
cin >> N >> M;
vector<string> S(N);
vector<Node> prefix_order(N), suffix_order(N);
for (int i = 0; i < N; ++i) {
cin >> S[i];
prefix_order[i] = {S[i], i};
string rev_s = S[i];
reverse(rev_s.begin(), rev_s.end());
suffix_order[i] = {rev_s, i};
}
sort(prefix_order.begin(), prefix_order.end(), compareNodes);
sort(suffix_order.begin(), suffix_order.end(), compareNodes);
// So'rovlarni qayta ishlash...
// 1. P prefiks diapazonini binary search bilan topish
// 2. Q suffiks (teskari) diapazonini binary search bilan topish
// 3. 2D Range count algoritmini qo'llash
return 0;
}