
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	static BigInteger[][] dp=new BigInteger[110][110];
	static int[][] a=new int[15][210];
	static int fa[]=new int[110];
	static int n;
	static int l;
	
	static int min(int a,int b){
		if (a<b) return a;
		return b;
	}
	
	static int max(int a,int b){
		if (a>b) return a;
		return b;
	}
	
	static void init(){
		for (int i=0;i<=n;i++)
			for (int j=0;j<=n;j++)
				dp[i][j]=BigInteger.ZERO;
		dp[0][0]=BigInteger.ONE;
		for (int i=1;i<=n;i++)
			for (int j=1;j<=min(n,i);j++){
				dp[i][j]=BigInteger.ZERO;
				dp[i][j]=(dp[i-1][j].multiply(BigInteger.valueOf(j))).add(dp[i-1][j-1]);
			}
	}
	
	static int find(int x){
		if (fa[x]==x) return x;
		fa[x]=find(fa[x]);
		return fa[x];
	}
	
	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(new File("partitions.in"));
		PrintWriter out = new PrintWriter(new File("partitions.out"));
		n=in.nextInt();
		l=in.nextInt();
		
		init();
		
		for (int i=0;i<l;i++){
			a[i][0]=in.nextInt();
			for (int j=1;j<=a[i][0];j++) a[i][j]=in.nextInt();
		}

		BigInteger p[]=new BigInteger[2010];
		
		for (int i=0;i<(1<<l);i++){
			int tot=0;

			for (int j=1;j<=n;j++) fa[j]=j;
			for (int j=0;j<l;j++)
				if (((i>>j)&1)==1){
					int x=find(a[j][1]);
					for (int k=2;k<=a[j][0];k++) fa[find(a[j][k])]=x; 
				}
			for (int j=1;j<=n;j++)
				if (fa[j]==j) tot++;
			p[i]=BigInteger.ZERO;
			for (int j=1;j<=tot;j++){
				p[i]=p[i].add(dp[tot][j]);
			}
			//System.out.println(p[i]);
		}
		
		for (int i=(1<<l)-1;i>=0;i--){
			for (int j=i-1;j>=0;j--)
				if ((i|j)==i) p[j]=p[j].subtract(p[i]);
		}
		
		BigInteger ans=BigInteger.ZERO;
		for (int i=1;i<=n;i++)
			ans=ans.add(dp[n][i]);
		System.out.println(ans);
		System.out.println(p[0]);
		for (int j=1;j<(1<<l);j++)
			ans=ans.subtract(p[j]);
		out.println(ans);
		in.close();
		out.close();
	}

}