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;
inline int pidorand() { return ((rand() & 32767) << 15) | (rand() & 32767); }
using namespace std;
inline int nxt() {
  int x;
  scanf("%d", &x);
  return x;
}
const int mod = 1000000007;
long long pw(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1ll) {
      res = res * a % mod;
    }
    b >>= 1;
    a = a * a % mod;
  }
  return res;
}
long long inv(long long x) { return pw(x >= mod ? x - mod : x, mod - 2); }
const int N = 1111;
int C[N][N];
int main() {
  for (int i = 0; i < N; ++i) {
    C[i][0] = C[i][i] = 1;
    for (int j = 1; j < i; ++j) {
      C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
      if (C[i][j] >= mod) {
        C[i][j] -= mod;
      }
    }
  }
  int m = nxt(), n = nxt();
  vector<vector<char>> a(n, vector<char>(m, 0));
  for (int i = 0; i < n; ++i) {
    string s;
    cin >> s;
    for (int j = 0; j < m; ++j) {
      a[i][j] = s[j] - '0';
    }
  }
  vector<long long> val(m);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (a[i][j]) {
        val[j] |= 1ll << i;
      }
    }
  }
  auto tmp = val;
  sort(((tmp)).begin(), ((tmp)).end());
  (tmp).resize(unique(((tmp)).begin(), ((tmp)).end()) - (tmp).begin());
  vector<long long> dp(m + 1);
  dp[0] = 1;
  for (int i = 1; i <= m; ++i) {
    for (int j = 0; j < i; ++j) {
      dp[i] += 1ll * C[i - 1][j] * dp[j] % mod;
    }
    dp[i] %= mod;
  }
  long long ans = 1;
  for (long long x : tmp) {
    int cnt = 0;
    for (long long y : val) {
      if (y == x) {
        ++cnt;
      }
    }
    ans = ans * dp[cnt] % mod;
  }
  cout << ans << "\n";
  return 0;
}
