You are given an integer m.

Let M = 2m - 1.

You are also given a set of n integers denoted as the set T. The integers will be provided in base 2 as n binary strings of length m.

A set of integers S is called "good" if the following hold. 

  1. If <image>, then <image>. 
  2. If <image>, then <image>
  3. <image>
  4. All elements of S are less than or equal to M. 



Here, <image> and <image> refer to the bitwise XOR and bitwise AND operators, respectively.

Count the number of good sets S, modulo 109 + 7.

Input

The first line will contain two integers m and n (1 ≤ m ≤ 1 000, 1 ≤ n ≤ min(2m, 50)).

The next n lines will contain the elements of T. Each line will contain exactly m zeros and ones. Elements of T will be distinct.

Output

Print a single integer, the number of good sets modulo 109 + 7. 

Examples

Input

5 3
11010
00101
11000


Output

4


Input

30 2
010101010101010010101010101010
110110110110110011011011011011


Output

860616440

Note

An example of a valid set S is {00000, 00101, 00010, 00111, 11000, 11010, 11101, 11111}.
#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1050;
long long cnk[maxn][maxn];
const long long mod = 1e9 + 7;
long long dp[maxn];
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long m, n;
  cin >> m >> n;
  cnk[0][0] = 1;
  for (long long i = 1; i < maxn; i++) {
    cnk[i][0] = 1;
    for (long long j = 1; j <= i; j++) {
      for (long long k = 0; k < 2; k++) {
        cnk[i][j] += cnk[i - 1][j - k];
        cnk[i][j] %= mod;
      }
    }
  }
  dp[0] = 1;
  for (long long i = 1; i < maxn; i++) {
    for (long long j = 0; j < i; j++) {
      dp[i] += cnk[i - 1][j] * dp[i - j - 1] % mod;
      dp[i] %= mod;
    }
  }
  vector<long long> mass;
  for (long long i = 0; i < m; i++) {
    mass.push_back(i);
  }
  vector<vector<long long> > united;
  united.push_back(mass);
  vector<string> s(n);
  for (long long i = 0; i < n; i++) {
    cin >> s[i];
    vector<vector<long long> > united1;
    for (long long j = 0; j < united.size(); j++) {
      vector<long long> go_to[2];
      for (long long u = 0; u < united[j].size(); u++) {
        long long ind = united[j][u];
        go_to[s[i][ind] - '0'].push_back(ind);
      }
      if (go_to[0].size()) {
        united1.push_back(go_to[0]);
      }
      if (go_to[1].size()) {
        united1.push_back(go_to[1]);
      }
    }
    united = united1;
  }
  long long ans = 1;
  for (long long i = 0; i < united.size(); i++) {
    ans = ans * dp[united[i].size()] % mod;
  }
  cout << ans;
  return 0;
}
