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 INF = 1001001001;
const long long INFLL = 1001001001001001001LL;
template <typename T>
void pv(T a, T b) {
  for (T i = a; i != b; ++i) cout << *i << " ";
  cout << endl;
}
template <typename T>
void chmin(T& a, T b) {
  if (a > b) a = b;
}
template <typename T>
void chmax(T& a, T b) {
  if (a < b) a = b;
}
int in() {
  int x;
  scanf("%d", &x);
  return x;
}
double fin() {
  double x;
  scanf("%lf", &x);
  return x;
}
long long lin() {
  long long x;
  scanf("%lld", &x);
  return x;
}
const long long MO = 1000000007;
long long comb[1024][1024], dp[1024];
int en[1024][1024];
char S[1024];
int main() {
  for (int i = 0; i < 1024; ++i) {
    comb[i][0] = comb[i][i] = 1;
    for (int j = 1; j < i; ++j) {
      comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % MO;
    }
  }
  dp[0] = dp[1] = 1;
  for (int i = 2; i < 1024; ++i) {
    for (int s = 0; s < i; ++s) {
      (dp[i] += comb[i - 1][s] * dp[s]) %= MO;
    }
  }
  const int B = in();
  const int N = in();
  for (int i = 0; i < B; ++i) {
    for (int j = 0; j < B; ++j) {
      en[i][j] = 1;
    }
  }
  for (int i = 0; i < N; ++i) {
    scanf("%s", S);
    vector<int> zer, one;
    for (int j = 0; j < B; ++j) {
      if (S[j] == '0') {
        zer.push_back(j);
      } else {
        one.push_back(j);
      }
    }
    for (const int z : zer) {
      for (const int o : one) {
        en[z][o] = en[o][z] = 0;
      }
    }
  }
  vector<int> done(B, 0);
  long long res = 1;
  for (int i = 0; i < B; ++i) {
    if (done[i]) {
      continue;
    }
    int sz = 0;
    for (int j = 0; j < B; ++j) {
      if (en[i][j]) {
        ++sz;
        done[j] = 1;
      }
    }
    (res *= dp[sz]) %= MO;
  }
  printf("%lld\n", res);
  return 0;
}
