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 MaxN = 1050;
const long long Mod = 1e9 + 7;
inline long long add(long long a, long long b) {
  return ((long long)(a) + b) % (long long)Mod;
}
inline long long mul(long long a, long long b) {
  return ((long long)a * (long long)b) % (long long)Mod;
}
long long binom[MaxN][MaxN];
long long N, M;
long long bell[MaxN];
long long potTwo[MaxN];
string S[55];
long long mark[MaxN];
map<long long, long long> occur;
void calcBinom() {
  for (long long(i) = (0); (i) < (M + 1); i++) {
    for (long long(k) = (0); (k) < (i + 1); k++) {
      if (k == 0)
        binom[i][k] = 1;
      else if (k == i)
        binom[i][k] = 1;
      else
        binom[i][k] = add(binom[i - 1][k - 1], binom[i - 1][k]);
    }
  }
}
void calcBell() {
  bell[0] = 1;
  bell[1] = 1;
  for (long long(i) = (1); (i) < (M + 1); i++) {
    for (long long(k) = (0); (k) < (i + 1); k++) {
      bell[i + 1] += mul(binom[i][k], bell[k]);
      bell[i + 1] %= Mod;
    };
  }
}
void calcPotTwo() {
  potTwo[0] = 1;
  for (long long(i) = (1); (i) < (M + 1); i++) {
    potTwo[i] = add(potTwo[i - 1], potTwo[i - 1]);
  }
}
void solve() {
  for (long long(k) = (0); (k) < (M); k++) {
    mark[k] = 0;
    for (long long(i) = (0); (i) < (N); i++) {
      if (S[i][k] == '1') {
        mark[k] += (((long long)1) << (long long)i);
      }
    }
    occur[mark[k]]++;
  }
  long long res = 1;
  for (long long(k) = (0); (k) < (M); k++) {
    if (occur[mark[k]] > 0) {
      ;
      res = mul(res, bell[occur[mark[k]]]);
      occur[mark[k]] = 0;
    }
  }
  cout << res << endl;
}
void load() {
  cin >> M >> N;
  for (long long(i) = (0); (i) < (N); i++) cin >> S[i];
}
int main() {
  load();
  calcBinom();
  calcBell();
  calcPotTwo();
  solve();
  return 0;
}
