#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
#if defined(_MSC_VER) || defined(ONLINE_JUDGE)
#define getchar_unlocked _getchar_nolock
#define putchar_unlocked _putchar_nolock
#endif
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define FOR(i, m, n) for(int i=(m); i<(n); ++i)
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mp make_pair
#define pb push_back
#define dump(x) cerr<<#x<<" = "<<(x)<<endl;
using LL=long long;
using VI=vector<int>;     using VL=vector<LL>;
using VVI=vector<VI>;     using VVL=vector<VL>;
using PII=pair<int, int>; using PLL=pair<LL, LL>;
using VS=vector<string>;
const int inf = (int)1e9;
const LL MOD = 1000000007;
const double pi = acos(-1.0);
const string Snum = "0123456789";
const int dx[] = { -1,0,1,0,-1,-1,1,1 }, dy[] = { 0,1,0,-1,-1,1,-1,1 };
template<class T>void Sort(T& a) { sort(a.begin(), a.end()); }
template<class T>void ReSort(T& a) { sort(a.rbegin(), a.rend()); }
template<class T>void Reverse(T& a) { reverse(a.begin(), a.end()); }
template<class T>void Unique(T& a) { a.erase(unique(a.begin(), a.end()), a.end()); }
template<class T>auto Max(const T& a) { return *max_element(a.begin(), a.end()); }
template<class T>auto Min(const T& a) { return *min_element(a.begin(), a.end()); }
template<class T, class U>int Count(const T& a, U c) { return count(a.begin(), a.end(), c); }
template<class T, class U>U Sum(const T& a, U init = 0) { return accumulate(a.begin(), a.end(), init); }
template<class T>T Age(T a, T b) { return (a + b - 1) / b; }
template<class T>T gcd(T n, T m) { return m == 0 ? n : gcd(m, n % m); }
template<class T>T lcm(T n, T m) { return n / gcd(n, m) * m; }

string InputStringFast() {
	string ret; char c = getchar_unlocked();
	while (c != '\0' && c != '\n' && c != '\t' && c != ' ') { ret.push_back(c); c = getchar_unlocked(); }
	return ret;
}
int InputIntFast() {
	int ret = 0; bool neg = false; char c = getchar_unlocked();
	if (c == '-') { neg = true; c = getchar_unlocked(); }
	while ('0' <= c && c <= '9') { ret = ret * 10 + (c - '0'); c = getchar_unlocked(); }
	return neg ? -ret : ret;
}
LL InputLLFast() {
	LL ret = 0; bool neg = false; char c = getchar_unlocked();
	if (c == '-') { neg = true; c = getchar_unlocked(); }
	while ('0' <= c && c <= '9') { ret = ret * 10LL + (LL(c) - LL('0')); c = getchar_unlocked(); }
	return neg ? -ret : ret;
}
double InputDoubleFast() {
	double ret = 0, dp = 0; bool neg = false, adp = false;
	char c = getchar_unlocked();
	if (c == '-') { neg = true; c = getchar_unlocked(); }
	while (('0' <= c && c <= '9') || c == '.') {
		if (c == '.')adp = true;
		if (adp) { dp *= 0.1; ret += (c - '0') * dp; }
		else { ret = ret * 10 + (c - '0'); }
		c = getchar_unlocked();
	}
	return neg ? -ret : ret;
}
struct InputString {
	operator string() { return InputStringFast(); }
	VS v(int n) {
		VS ret(n);
		rep(i, n)ret[i] = InputStringFast();
		return ret;
	}
}ins;
struct InputInt {
	operator int() { return InputIntFast(); }
	VI v(int n) {
		VI ret(n);
		rep(i, n)ret[i] = InputIntFast();
		return ret;
	}
	VVI vv(int h, int w) {
		VVI ret(h, VI(w));
		rep(i, h)rep(j, w)ret[i][j] = InputIntFast();
		return ret;
	}
}ini;
struct InputLL {
	operator LL() { return InputLLFast(); }
	VL v(int n) {
		VL ret(n);
		rep(i, n)ret[i] = InputLLFast();
		return ret;
	}
	VVL vv(int h, int w) {
		VVL ret(h, VL(w));
		rep(i, h)rep(j, w)ret[i][j] = InputLLFast();
		return ret;
	}
}inl;
struct InputDouble {
	operator double() { return InputDoubleFast(); }
	vector<double> v(int n) {
		vector<double> ret(n);
		rep(i, n)ret[i] = InputDoubleFast();
		return ret;
	}
}ind;

int main() {
	int n = ini, m = ini;
	VI cnt(m);
	rep(i, n) {
		int k = ini;
		rep(i, k)cnt[ini - 1]++;
	}
	cout << Count(cnt, n) << endl;
}

Measured memory_bytes: 256