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 MM = 1000000007;
const int MX = 1005;
long long pw(long long a, long long b = MM - 2) {
  long long r = 1;
  while (b) {
    if (b & 1) r = r * a % MM;
    a = a * a % MM;
    b /= 2;
  }
  return r;
}
struct UF {
  int t[MX], cnt[MX];
  int find(int x) { return t[x] ? t[x] = find(t[x]) : x; }
  int merge(int a, int b) {
    a = find(a), b = find(b);
    if (a == b) return 0;
    cnt[a] += cnt[b];
    t[b] = a;
    return 1;
  }
} uf;
long long T[MX][MX], U[MX];
char D[MX][MX];
int main() {
  int N, M;
  scanf("%d%d", &M, &N);
  for (int i = 1; i <= M; i++) uf.cnt[i] = 1;
  for (int i = 1; i <= N; i++) scanf("%s", D[i] + 1);
  N++;
  for (int j = 1; j <= M; j++) D[N][j] = '1';
  for (int i = 1; i <= M; i++) {
    for (int j = i + 1; j <= M; j++) {
      int ch = 0;
      for (int k = 1; k <= N; k++) {
        if (D[k][i] == D[k][j]) ch |= 1;
        if (D[k][i] != D[k][j]) ch |= 2;
      }
      if (ch == 1) uf.merge(i, j);
    }
  }
  T[1][1] = 1;
  for (int i = 1; i <= M; i++) {
    for (int j = 1; j <= M; j++) {
      T[i + 1][j] = (T[i + 1][j] + T[i][j] * j) % MM;
      T[i + 1][j + 1] = (T[i + 1][j + 1] + T[i][j]) % MM;
      U[i] = (U[i] + T[i][j]) % MM;
    }
  }
  long long ans = 1;
  for (int i = 1; i <= M; i++) {
    if (uf.find(i) == i) ans = ans * U[uf.cnt[i]] % MM;
  }
  printf("%lld\n", ans);
}
