#include "bits/stdc++.h"
#define ff first
#define ss second
#define ll long long
using namespace std;
const int N = 2e3+3;
const int mod = 1e9+7;
ll f[N],in[N];
int dp[N][N];
vector <int> a;
int n,k;
int pw(int a,int b){
if (!b)
return 1;
ll h = pw(a,b/2);
if (b&1)
h = (h*a)%mod;
return (h*h)%mod;
}
int C(int n,int k){
return f[n] * in[k]%mod * in[n-k]%mod;
}
int coz(int m,int k){
int &h = dp[m][k];
if (~h)
return h;
if (!m){
if (!k)
h = 1;
else h = 0;
return h;
}
h = 0;
for (int i = 0;i <= a[m-1];i++){
if (i*(i-1)/2 > k)
break;
h = (h+(C(a[m-1],i)*coz(m-1,k-i*(i-1)/2))%mod)%mod;
}
return h;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 0;i < N;i++){
fill(dp[i],dp[i]+N,-1);
}
f[0] = 1;
for (int i = 1;i < N;i++){
f[i] = (f[i-1]*i)%mod;
}
in[N-1] = pw(f[N-1],mod-2);
for (int i = N-2;i >= 0;i--){
in[i] = (in[i+1]*(i+1))%mod;
}
cin >> n >> k;
map <string,int> mp;
for (int i = 0;i < n;i++){
string s;
cin >> s;
sort(s.begin(),s.end());
mp[s]++;
}
int m = 0;
for (auto i : mp){
a.push_back(i.ss);
m++;
}
// dp[0][0] = 1;
// for (int i = 1;i <= m;i++){
// for (int j = 0;j <= k;j++){
// for (int h = 0;h <= a[i-1];h++){
// if (h*(h-1)/2 > j)
// break;
// dp[i][j] = (dp[i][j] + C(a[i-1],h)*dp[i-1][j-h*(h-1)/2])%mod;
// }
// }
// }
cout << coz(m,k) << "\n";
}