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 int M = 1005, mod = (int)1e9 + 7, N = M;
int m, n, k;
int gp[M], ngp[M];
int sz[M];
long long sp[N];
long long fac[N], facinv[N];
long long inv[N];
long long fp(long long x, long long k) {
  if (k == 0) return 1;
  long long hf = fp(x, k / 2);
  return k % 2 ? hf * hf % mod * x % mod : hf * hf % mod;
}
long long comb(int n, int k) {
  return fac[n] * facinv[k] % mod * facinv[n - k] % mod;
}
int main() {
  inv[1] = 1;
  for (int i = 2; i < N; i++)
    inv[i] = (mod - (mod / i) * inv[mod % i] % mod) % mod;
  fac[0] = 1;
  for (int i = 1; i <= N - 1; i++) fac[i] = fac[i - 1] * i % mod;
  facinv[N - 1] = fp(fac[N - 1], mod - 2);
  for (int i = N - 1 - 1; i >= 0; i--)
    facinv[i] = facinv[i + 1] * (i + 1) % mod;
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  sp[1] = 1;
  for (int i = 2; i < N; i++) {
    sp[i] = 1;
    for (int j = 0; j < i; j++) {
      sp[i] = (sp[i] + comb(i - 1, j) * sp[i - 1 - j]) % mod;
    }
  }
  cin >> m >> n;
  for (int i = 0; i < n; i++) {
    string str;
    cin >> str;
    k = 0;
    for (int j = 0; j < m; j++) {
      int cat = -1;
      for (int l = 0; l < j; l++) {
        if (gp[j] == gp[l] && str[j] == str[l]) cat = ngp[l];
      }
      if (cat == -1) cat = k++;
      ngp[j] = cat;
    }
    for (int j = 0; j < m; j++) gp[j] = ngp[j];
  }
  long long res = 1;
  for (int i = 0; i < m; i++) sz[gp[i]]++;
  for (int i = 0; i < k; i++) res = (res * sp[sz[i]]) % mod;
  cout << (res % mod + mod) % mod << endl;
}
