#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
#include <map>
// #include <bits/std++.h>
#define in cin
#define out cout
using namespace std;
const int MOD = 1e9 + 7;
signed main(){
ios_base::sync_with_stdio(false);
in.tie(NULL);
int n, k; in >> n >> k;
vector<string> v[n];
int dp[n][k];
for(int i = 0; i < n; i++){
v[i].resize(k);
for(int j = 0; j < k; j++) in >> v[i][j];
}
for(int i = 0; i < k; i++) dp[n - 1][i] = 1;
for(int i = n - 2; i >= 0; i--){
// fac toate subsecv si add dinamicile la un map sau cv
map<string, int> mp;
for(int j = 0; j < k; j++){
// pt secv v[i + 1][j] osa am 2 var
string v1 = v[i + 1][j];
v1.pop_back();
mp[v1] = (mp[v1] + dp[i + 1][j]) % MOD;
string ok = v1;
// cout << "pt " << v[i + 1][j] << " am var " << v1 << " cu ";
v1 = v[i + 1][j];
v1.erase(v1.begin());
if(v1 != ok) mp[v1] = (mp[v1] + dp[i + 1][j]) % MOD;
// cout << v1 << '\n';
}
for(int j = 0; j < k; j++){
dp[i][j] = mp[ v[i][j] ];
}
}
// cout << "dp : \n";
// for(int i = 0; i < n; i++){
// for(int j = 0; j < k; j++) cout << dp[i][j] << " ";
// cout << '\n';
// }
int s = 0;
for(int i = 0; i < k; i++) s = (s + dp[0][i]) % MOD;
out << s << '\n';
return 0;
}