#include <bits/stdc++.h>
const int inf = (1ll << 30) - 1;
const int maxn = (int)1e5 + 10;
using namespace std;
int t[400400];
int n, m;
int ans;
int la[400400];
vector<pair<int, pair<int, int> > > g[100100];
int cnt[44][44];
vector<pair<int, int> > temp;
int cur = 0;
void clr() {
  ans = 0;
  cur = 0;
  for (int i = 0; i < 44; i++)
    for (int j = 0; j < 44; j++) cnt[i][j] = 0;
}
void add(pair<int, int> x) {
  cnt[x.first][x.second]++;
  cur++;
}
void del(pair<int, int> x) {
  cnt[x.first][x.second]--;
  cur--;
}
bool isgood() {
  temp.clear();
  for (int i = 1; i < 41; i++) {
    for (int j = 0; j < i; j++) {
      if (cnt[j][i] > 0) {
        int k = i;
        for (int t = 2; t < 41; t++) {
          if (k % t == 0) {
            int cc = 1;
            while (k % t == 0) {
              cc *= t;
              temp.push_back(make_pair(cc, j % cc));
              k /= t;
            }
          }
        }
      }
    }
  }
  sort(temp.begin(), temp.end());
  for (int i = 1; i < temp.size(); i++)
    if (temp[i].first == temp[i - 1].first &&
        temp[i].second != temp[i - 1].second)
      return 0;
  return 1;
}
void get(vector<pair<int, pair<int, int> > > &v) {
  clr();
  if (v.size() == 0) return;
  for (int i = 0, j = 0; i < v.size();) {
    if (i == j) {
      add(v[i].second);
      j++;
    }
    while (j < v.size()) {
      if (v[j].first - 1 != v[j - 1].first) break;
      add(v[j].second);
      if (isgood()) {
        j++;
      } else {
        del(v[j].second);
        break;
      }
    }
    ans = max(ans, cur);
    del(v[i].second);
    i++;
  }
}
void solve() {
  scanf("%d%d", &n, &m);
  for (int i = 0, k; i < n; i++) {
    scanf("%d", &k);
    for (int j = 0, x; j < k; j++) {
      scanf("%d", &x);
      g[x].push_back(make_pair(i, make_pair(j, k)));
    }
  }
  for (int i = 1; i <= m; i++) {
    get(g[i]);
    printf("%d\n", ans);
  }
}
int main() {
  int t = 1;
  for (int i = 1; i <= t; i++) {
    solve();
  }
  return 0;
}
