/*
看到n很小可以状压
首先第一眼可以想到f[i][sta]表示到第i轮,物品选择状态为sta的最大期望值。
但是这样有个问题,可能到第i轮无法达到sta这个状态,但是也被当做了合法往后进行转移。
所以考虑倒退,这样状态就更改为f[i][sta]表示1~i-1轮能够到达sta这个状态,i到k轮的最大期望值。
这样就可以倒退,枚举下一个物品选不选进行转移了。
注意一点
这里求的是期望值,上面求的东西覆盖了第i轮取了所有n种宝物的情况
所以在每一个状态计算完之后,把f[i][sta]除以n即为期望平均值。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 107
using namespace std;
int n,k,cnt,need[N];
double val[16],f[N][1<<16];
inline int read()
{
int x=0,f=1;char c=getchar();
while(c>‘9‘||c<‘0‘){if(c==‘-‘)f=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
return x*f;
}
int main()
{
int x;
k=read();n=read();
for(int i=1;i<=n;i++)
{
scanf("%lf",&val[i]);x=read();
while(x) need[i]|=(1<<x-1),x=read();
}
for(int i=k;i;i--)
for(int sta=0;sta<=(1<<n)-1;sta++)
{
for (int j=1; j<=n; j++)
if ((sta&need[j])==need[j])
f[i][sta]+=max(f[i+1][sta],f[i+1][sta|(1<<(j-1))]+val[j]);
else
f[i][sta]+=f[i+1][sta];
f[i][sta]/=(double)n;
}
printf("%.6lf\n",f[1][0]);
return 0;
}