#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const double ep = 1e-7;
const double pi = 3.14159265358979323846264338327950288L;
template <class T>
inline void chkmax(T &x, T y) {
  if (x < y) x = y;
}
template <class T>
inline void chkmin(T &x, T y) {
  if (x > y) x = y;
}
inline char nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline bool read(int &x) {
  char c = nc(), b = 1;
  for (; !(c >= '0' && c <= '9'); c = nc()) {
    if (c == '-') b = -b;
    if (c == -1) return 0;
  }
  for (x = 0; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = nc())
    ;
  x *= b;
  return 1;
}
int n, m, cur, sum, k[1111], id[1111];
vector<int> vec[1111], tp;
long double a[1111], d[1111], dp[1111][1111];
int main() {
  read(n), read(m);
  for (int i = 0, j; i < m; i++) {
    read(k[i]), vec[i].resize(k[i]), d[i] = 1;
    for (j = 0; j < k[i]; j++) read(vec[i][j]);
    sort(vec[i].begin(), vec[i].end(), greater<int>());
  }
  while (1) {
    cur = 0, tp.clear();
    for (int i = 0; i < m; i++)
      if (id[i] < k[i]) chkmax(cur, vec[i][id[i]]);
    for (int i = 0; i < m; i++) {
      if (id[i] < k[i] && cur == vec[i][id[i]]) {
        a[i] = 1.0 * (id[i] + 1) / (k[i] - id[i]);
        tp.push_back(i), sum++, id[i]++;
      }
    }
    if (sum >= n) break;
    for (int i = tp.size() - 1; i >= 0; i--) d[tp[i]] *= a[tp[i]];
  }
  int sz = tp.size(), k = sz + n - sum;
  for (int i = 0; i <= sz; i++) {
    dp[i][0] = 1;
    for (int j = 1; j <= i; j++)
      dp[i][j] =
          a[tp[i - 1]] * dp[i - 1][j - 1] * j / i + dp[i - 1][j] * (i - j) / i;
  }
  long double rlt = 1;
  for (int i = 0; i < m; i++) rlt *= d[i];
  rlt *= dp[sz][k];
  printf("%.12lf\n", (double)rlt);
  return 0;
}
