#include <bits/stdc++.h>
using namespace std;
long long ans[1000005] = {};
void update(int l, int r, int val) {
  if (l > r) return;
  ans[l] += val;
  ans[r + 1] -= val;
}
int main() {
  int t, w;
  scanf("%d%d", &t, &w);
  while (t--) {
    int n;
    scanf("%d", &n);
    vector<int> a(n);
    vector<pair<int, pair<int, int>>> b;
    for (int i = 0; i < n; i++) {
      scanf("%d", &a[i]);
      b.push_back(make_pair(a[i], make_pair(i, w - n + i)));
    }
    sort(b.begin(), b.end());
    reverse(b.begin(), b.end());
    if (w < 2 * n) {
      set<int> s;
      for (int i = 0; i < w; i++) {
        s.insert(i);
      }
      bool first = 1;
      for (int i = 0; i < n; i++) {
        if (b[i].first < 0 && first) {
          auto itf = s.lower_bound(0), ite = s.lower_bound(w - n);
          s.erase(itf, ite);
          itf = s.lower_bound(n), ite = s.lower_bound(w);
          s.erase(itf, ite);
          first = 0;
          i--;
        } else {
          auto itf = s.lower_bound(b[i].second.first),
               ite = s.upper_bound(b[i].second.second);
          for (auto it = itf; it != ite; it++) {
            update(*it, *it, b[i].first);
          }
          s.erase(itf, ite);
        }
      }
    } else {
      int mx = max(b.front().first, 0);
      update(n, w - n - 1, mx);
      vector<bool> used1(n, 0), used2(n, 0);
      for (int i = 0; i < n; i++) {
        if (b[i].first < 0) break;
        for (int j = b[i].second.first; j < n; j++) {
          if (!used1[j]) {
            used1[j] = 1;
            update(j, j, b[i].first);
          } else {
            break;
          }
        }
        for (int j = b[i].second.second; j >= w - n; j--) {
          if (!used2[j - (w - n)]) {
            used2[j - (w - n)] = 1;
            update(j, j, b[i].first);
          } else {
            break;
          }
        }
      }
    }
  }
  for (int i = 0; i < w; i++) {
    if (i) ans[i] += ans[i - 1];
    cout << ans[i] << " ";
  }
  cout << endl;
  return 0;
}
