#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
long long qpow(long long x, long long y, long long MOD) {
  long long a = 1;
  while (y) {
    if (y & 1) a = a * x % MOD;
    x = x * x % MOD;
    y >>= 1;
  }
  return a;
}
int n, w;
multiset<long long> st[N];
vector<pair<int, int> > in[N], out[N];
long long ans[N];
int main() {
  scanf("%d%d", &n, &w);
  for (int i = int(1); i <= int(n); ++i) {
    int x, y;
    scanf("%d", &x);
    if (x < w) {
      in[1].push_back(make_pair(0, i)), out[w - x].push_back(make_pair(0, i));
      in[x + 1].push_back(make_pair(0, i)), out[w].push_back(make_pair(0, i));
    }
    for (int j = int(1); j <= int(x); ++j) {
      scanf("%d", &y);
      in[j].push_back(make_pair(y, i));
      out[w - x + j].push_back(make_pair(y, i));
    }
  }
  for (int i = int(1); i <= int(w); ++i) {
    for (auto tp : in[i]) {
      int x = tp.first, y = tp.second;
      if (!st[y].empty()) ans[i] -= *st[y].rbegin();
      st[y].insert(1LL * x);
      ans[i] += *st[y].rbegin();
    }
    ans[i + 1] = ans[i];
    for (auto tp : out[i]) {
      int x = tp.first, y = tp.second;
      ans[i + 1] -= *st[y].rbegin();
      st[y].erase(st[y].find(x));
      if (!st[y].empty()) ans[i + 1] += *st[y].rbegin();
    }
  }
  for (int i = int(1); i <= int(w); ++i) printf("%lld ", ans[i]);
  return 0;
}
