import java.util.*;
import java.util.stream.*;
import java.util.function.*;

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(new Main().solve());
    }
    
    // パラメタ渡しもちゃんとクラス作るのも面倒なので手抜き
    // 必要な値はここで全部取ってしまう
    Scanner sc = new Scanner(System.in);
    // 人数
    int n = Integer.parseInt(sc.next());
    // 種類
    int m = Integer.parseInt(sc.next());
    {sc.nextLine();}
    int[][] a = new int[n][];
    {
        // a[0]は使わない
        for(int i = 0; i < n; i++) {
            int k = Integer.parseInt(sc.next());
            a[i] = new int[k];
            for(int j = 0; j < k; j++) {
                a[i][j] = Integer.parseInt(sc.next());
            }
        }
    }
    
    String solve() {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    }
    
}

 import java.util.*; util.* java import java.util.stream.*; stream.* java.util import java.util.function.*; function.* java.util public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(new Main().solve());
    }
    
    // パラメタ渡しもちゃんとクラス作るのも面倒なので手抜き
    // 必要な値はここで全部取ってしまう
    Scanner sc = new Scanner(System.in);
    // 人数
    int n = Integer.parseInt(sc.next());
    // 種類
    int m = Integer.parseInt(sc.next());
    {sc.nextLine();}
    int[][] a = new int[n][];
    {
        // a[0]は使わない
        for(int i = 0; i < n; i++) {
            int k = Integer.parseInt(sc.next());
            a[i] = new int[k];
            for(int j = 0; j < k; j++) {
                a[i][j] = Integer.parseInt(sc.next());
            }
        }
    }
    
    String solve() {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    }
    
} Main // パラメタ渡しもちゃんとクラス作るのも面倒なので手抜き
    // 必要な値はここで全部取ってしまう
    Scanner sc = new Scanner(System.in); sc new Scanner(System.in) // 人数
    int n = Integer.parseInt(sc.next()); n Integer.parseInt(sc.next()) Integer.parseInt Integer sc.next() sc.next sc // 種類
    int m = Integer.parseInt(sc.next()); m Integer.parseInt(sc.next()) Integer.parseInt Integer sc.next() sc.next sc int[][] a = new int[n][]; a new int[n][] n public static void main(String[] args) throws Exception {
        System.out.println(new Main().solve());
    } main {
        System.out.println(new Main().solve());
    } System.out.println(new Main().solve()) System.out.println System.out System System.out new Main().solve() new Main().solve new Main() String[] args args String solve() {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    } solve {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    } List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList()); foods IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList()) IntStream.rangeClosed(1, m).boxed().collect IntStream.rangeClosed(1, m).boxed() IntStream.rangeClosed(1, m).boxed IntStream.rangeClosed(1, m) IntStream.rangeClosed IntStream 1 m Collectors.toList() Collectors.toList Collectors for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        } int[] aa a {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        } {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        } foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList())) foods.retainAll foods IntStream.of(aa).boxed().collect(Collectors.toList()) IntStream.of(aa).boxed().collect IntStream.of(aa).boxed() IntStream.of(aa).boxed IntStream.of(aa) IntStream.of IntStream aa Collectors.toList() Collectors.toList Collectors return ""+foods.size(); ""+foods.size() "" foods.size() foods.size foods public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(new Main().solve());
    }
    
    // パラメタ渡しもちゃんとクラス作るのも面倒なので手抜き
    // 必要な値はここで全部取ってしまう
    Scanner sc = new Scanner(System.in);
    // 人数
    int n = Integer.parseInt(sc.next());
    // 種類
    int m = Integer.parseInt(sc.next());
    {sc.nextLine();}
    int[][] a = new int[n][];
    {
        // a[0]は使わない
        for(int i = 0; i < n; i++) {
            int k = Integer.parseInt(sc.next());
            a[i] = new int[k];
            for(int j = 0; j < k; j++) {
                a[i][j] = Integer.parseInt(sc.next());
            }
        }
    }
    
    String solve() {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    }
    
} public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(new Main().solve());
    }
    
    // パラメタ渡しもちゃんとクラス作るのも面倒なので手抜き
    // 必要な値はここで全部取ってしまう
    Scanner sc = new Scanner(System.in);
    // 人数
    int n = Integer.parseInt(sc.next());
    // 種類
    int m = Integer.parseInt(sc.next());
    {sc.nextLine();}
    int[][] a = new int[n][];
    {
        // a[0]は使わない
        for(int i = 0; i < n; i++) {
            int k = Integer.parseInt(sc.next());
            a[i] = new int[k];
            for(int j = 0; j < k; j++) {
                a[i][j] = Integer.parseInt(sc.next());
            }
        }
    }
    
    String solve() {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    }
    
} Main
import java.util.*;
import java.util.stream.*;
import java.util.function.*;

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(new Main().solve());
    }
    
    // パラメタ渡しもちゃんとクラス作るのも面倒なので手抜き
    // 必要な値はここで全部取ってしまう
    Scanner sc = new Scanner(System.in);
    // 人数
    int n = Integer.parseInt(sc.next());
    // 種類
    int m = Integer.parseInt(sc.next());
    {sc.nextLine();}
    int[][] a = new int[n][];
    {
        // a[0]は使わない
        for(int i = 0; i < n; i++) {
            int k = Integer.parseInt(sc.next());
            a[i] = new int[k];
            for(int j = 0; j < k; j++) {
                a[i][j] = Integer.parseInt(sc.next());
            }
        }
    }
    
    String solve() {
        List<Integer> foods = IntStream.rangeClosed(1, m).boxed().collect(Collectors.toList());
        
        // 全員に共通する要素の数を出力
        for(int[] aa: a) {
            foods.retainAll(IntStream.of(aa).boxed().collect(Collectors.toList()));
        }
        return ""+foods.size();
    }
    
}


