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;
template <class C>
void mini(C &a4, C b4) {
  a4 = min(a4, b4);
}
template <class C>
void maxi(C &a4, C b4) {
  a4 = max(a4, b4);
}
template <class TH>
void _dbg(const char *sdbg, TH h) {
  cerr << sdbg << '=' << h << endl;
}
template <class TH, class... TA>
void _dbg(const char *sdbg, TH h, TA... a) {
  while (*sdbg != ',') cerr << *sdbg++;
  cerr << '=' << h << ',';
  _dbg(sdbg + 1, a...);
}
template <class T>
ostream &operator<<(ostream &os, vector<T> V) {
  os << "[";
  for (auto vv : V) os << vv << ",";
  return os << "]";
}
template <class L, class R>
ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
const long long P = 1e9 + 7;
const long long MAX = 1111;
long long m, n;
long long dp[MAX][MAX];
string t[MAX];
void add(long long &a, long long b) {
  a += b;
  if (a >= P) a -= P;
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  if (0) cout << fixed << setprecision(6);
  cin >> m >> n;
  for (long long i = (0); i <= ((long long)(n)-1); i++) {
    cin >> t[i];
  }
  map<long long, long long> ile;
  for (long long i = (0); i <= ((long long)(m)-1); i++) {
    long long pom = 0;
    for (long long j = (0); j <= ((long long)(n)-1); j++) {
      pom *= 2;
      pom += t[j][i] - '0';
    }
    ile[pom]++;
  }
  dp[1][1] = 1;
  for (long long i = 2; i <= m; i++) {
    for (long long j = (0); j <= ((long long)(i)-1); j++) {
      add(dp[i][j], dp[i - 1][j] * j % P);
      add(dp[i][j + 1], dp[i - 1][j]);
    }
  }
  long long res = 1;
  for (pair<long long, long long> el : ile) {
    long long ak = 0;
    for (long long i = (0); i <= ((long long)(el.second + 1) - 1); i++) {
      add(ak, dp[el.second][i]);
    }
    (ak, el.second);
    res = res * ak % P;
  }
  cout << res << "\n";
}
