#include <bits/stdc++.h>
using namespace std;
inline long long pow(long long a, long long b, long long mo) {
  if (!a) return 0;
  long long tmp = 1;
  for (; b; b >>= 1) {
    if (b & 1) tmp = (long long)tmp * a % mo;
    a = (long long)a * a % mo;
  }
  return tmp;
}
template <class T>
inline void R(T &xx) {
  xx = 0;
  char ch = getchar();
  bool F = 0;
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') F = 1, ch = getchar();
  while (ch >= '0' && ch <= '9')
    xx = xx + xx + (xx << 3) + ch - 48, ch = getchar();
  if (F) xx = -xx;
}
double C[1011][1011], dp[1011][1011];
int a[1011][1011], al[1011], n, m, cnt[1011], tt;
int main() {
  for (int i = 0; i < (int)(1001); i++) {
    C[i][0] = 1;
    for (int j = (1); j <= (i); j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
  }
  R(m), R(n);
  for (int i = (1); i <= (n); i++) {
    R(cnt[i]);
    for (int j = (1); j <= (cnt[i]); j++) R(a[i][j]), al[++tt] = a[i][j];
    sort(a[i] + 1, a[i] + cnt[i] + 1, greater<int>());
  }
  sort(al + 1, al + 1 + tt, greater<int>());
  int M = al[m];
  int cho = 0;
  for (int i = (1); i <= (tt); i++) {
    int nw = 1;
    while (a[i][nw] > M) nw++;
    if (a[i][nw] == M) cho++;
    m -= nw - 1;
  }
  dp[0][0] = 1;
  for (int i = (1); i <= (n); i++) {
    int nw = 1;
    while (a[i][nw] > M) nw++;
    if (a[i][nw] != M)
      for (int j = (0); j <= (m); j++)
        dp[i][j] = dp[i - 1][j] / C[cnt[i]][nw - 1];
    else
      for (int j = (0); j <= (m); j++) {
        dp[i][j] = dp[i - 1][j] / C[cnt[i]][nw - 1];
        if (j) dp[i][j] += dp[i - 1][j - 1] / C[cnt[i]][nw];
      }
  }
  printf("%.10f\n", dp[n][m] / C[cho][m]);
  return 0;
}
