#include <bits/stdc++.h>
using namespace std;

long long ways[1<<16];
long long mod = 1000000007;

long long dp[17][1<<16];
int posCode[16];
int toMask[1<<16];

class CampLunch
{
	public:
	int count(int N, int M, vector <string> a)
	{
		memset(ways, 0, sizeof(ways));
		for(int mask = 0; mask < (1<<(M-1)); mask ++)
			if((mask & (mask<<1)) == 0)
			{
				int x = mask | (mask << 1);
				for(int i = 0; i < (1<<M); i++)
					if((x & i) == 0)
						ways[i] ++;
			}
		memset(dp, 0, sizeof(dp));
		dp[0][0] = 1;
		for(int i = 0; i < N; i++)
		{
			for(int j = 0; j < M; j++)
			{
				posCode[a[i][j]-'A'] = (1<<j); 
			}
			for(int j = 0; j < (1<<M); j++)
			{
				toMask[j] = 0;
				for(int k = 0; k < M; k++)
					if((j & (1<<k)) > 0)
					{
						toMask[j] += posCode[k];
					}
			}


			for(int mask = 0; mask < (1<<M); mask ++)
			{
				if(dp[i][mask] == 0) continue;
				dp[i][mask] %= mod;
				int remain = (1<<M)-1 - mask;
				for(int take = remain; ; take = ((take-1)&remain))
				{
					dp[i+1][take] += dp[i][mask] * ways[toMask[mask | take]];
					//dp[i+1][take] %= mod;
					if(take == 0)
						break;
				}
			}
		}
		return dp[N][0] % mod;
	}

};
