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 big = 1000000007;
long long n, m, k, T;
long long FAC[1001] = {0};
long long INV[1001] = {0};
vector<long long> H;
long long DP[1001] = {0};
bool DPC[1001] = {0};
long long upp(long long i, long long j) {
  if (j == 0) return 1;
  long long h = upp(i, j / 2);
  if (j % 2 == 0) return (h * h) % big;
  return (i * ((h * h) % big)) % big;
}
long long bin(long long i, long long j) {
  if (i < j || i < 0 || j < 0) return 0;
  return (FAC[i] * ((INV[i - j] * INV[j]) % big)) % big;
}
long long dp(long long i) {
  if (i == 0) return 1;
  if (DPC[i]) return DP[i];
  long long ans = 0;
  for (long long c1 = 1; c1 <= i; c1++) {
    ans += bin(i - 1, c1 - 1) * dp(i - c1);
    ans %= big;
  }
  DP[i] = ans;
  DPC[i] = 1;
  return ans;
}
int main() {
  long long a, b, c, d;
  long long t = 1;
  for (long long c1 = 0; c1 < 1001; c1++) {
    FAC[c1] = t;
    INV[c1] = upp(t, big - 2);
    t *= c1 + 1;
    t %= big;
  }
  cin >> m >> n;
  for (long long c1 = 0; c1 < m; c1++) {
    H.push_back(0);
  }
  string s;
  t = 1;
  for (long long c1 = 0; c1 < n; c1++) {
    cin >> s;
    for (long long c2 = 0; c2 < m; c2++) {
      if (s[c2] == '1') {
        H[c2] += t;
      }
    }
    t *= 2;
  }
  sort(H.begin(), H.end());
  long long prev = H[0];
  long long now = 0;
  long long ans = 1;
  for (long long c1 = 0; c1 < m; c1++) {
    if (H[c1] != prev) {
      ans *= dp(now);
      ans %= big;
      now = 1;
    } else {
      now++;
    }
    prev = H[c1];
  }
  ans *= dp(now);
  ans %= big;
  cout << ans << "\n";
  return 0;
}
