#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
template <typename T>
bool mmax(T &m, const T q) {
  if (m < q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T>
bool mmin(T &m, const T q) {
  if (m > q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec) is >> v;
  return is;
}
int main() {
  int N, W;
  cin >> N >> W;
  vector<lint> rimos(W + 10);
  for (int _ = (0), __end_ = (N); _ < __end_; _++) {
    int L;
    cin >> L;
    vector<int> A(L);
    cin >> A;
    if (L * 2 <= W) {
      int maxi = 0;
      for (int i = (0), i_end_ = (L); i < i_end_; i++) {
        mmax(maxi, A[i]);
        rimos[i] += maxi, rimos[i + 1] -= maxi;
      }
      maxi = 0;
      for (int i = (0), i_end_ = (L); i < i_end_; i++) {
        mmax(maxi, A[L - 1 - i]);
        rimos[W - 1 - i] += maxi, rimos[W - i] -= maxi;
      }
      rimos[L] += maxi, rimos[W - L] -= maxi;
    } else {
      queue<int> choice;
      multiset<int> se;
      for (int i = (0), i_end_ = (W); i < i_end_; i++) {
        if (i < L) choice.push(A[i]), se.insert(A[i]);
        if (i > W - L) {
          se.erase(se.lower_bound(choice.front()));
          choice.pop();
        }
        int addv = *prev(se.end());
        if (i < W - L or i >= L) mmax(addv, 0);
        rimos[i] += addv, rimos[i + 1] -= addv;
      }
    }
  }
  for (int i = (0), i_end_ = (W); i < i_end_; i++) rimos[i + 1] += rimos[i];
  for (int i = (0), i_end_ = (W); i < i_end_; i++) printf("%lld ", rimos[i]);
  puts("");
}
