#include <bits/stdc++.h>
using namespace std;
using li = long long;
using ld = long double;
pair<li, int> xmin(pair<li, int> a, pair<li, int> b) {
  if (a.first != b.first) {
    return a.first < b.first ? a : b;
  } else {
    return a.second > b.second ? a : b;
  }
}
struct segtree {
  vector<pair<li, int>> tree;
  vector<li> addition;
  segtree(int n) : tree(n * 4), addition(n * 4) { build(0, 0, n - 1); }
  void build(int t, int l, int r) {
    if (l == r) {
      tree[t].second = l;
      return;
    }
    int m = (l + r) / 2;
    build(t * 2 + 1, l, m);
    build(t * 2 + 2, m + 1, r);
    tree[t] = xmin(tree[t * 2 + 1], tree[t * 2 + 2]);
  }
  void add(int t, int l, int r, int x, int y, li val) {
    if (x > r || y < l) {
      return;
    }
    if (l >= x && r <= y) {
      tree[t].first += val;
      addition[t] += val;
      return;
    }
    int m = (l + r) / 2;
    add(t * 2 + 1, l, m, x, y, val);
    add(t * 2 + 2, m + 1, r, x, y, val);
    tree[t] = xmin(tree[t * 2 + 1], tree[t * 2 + 2]);
    tree[t].first += addition[t];
  }
};
const int INF = 1e9 + 100;
struct Mset {
  deque<int> d;
  map<int, int> cnt;
  void add(int x) {
    d.push_back(x);
    ++cnt[x];
  }
  void pop() {
    int y = d.front();
    d.pop_front();
    --cnt[y];
    if (cnt[y] == 0) {
      cnt.erase(y);
    }
  }
  int max() { return prev(cnt.end())->first; }
  int size() { return d.size(); }
};
void solve(bool read) {
  int n, w;
  cin >> n >> w;
  vector<li> ans(w + 1);
  auto addSeg = [&](int l, int r, li x) {
    ans[l] += x;
    ans[r + 1] -= x;
  };
  for (int i = 0; i < n; ++i) {
    int l;
    cin >> l;
    int mx = -INF;
    vector<int> b(l);
    for (int j = 0; j < l; ++j) {
      cin >> b[j];
      mx = max(mx, b[j]);
    }
    if (l - 1 <= w - l) {
      addSeg(l - 1, w - l, l - 1 == w - l ? mx : max(mx, 0));
    }
    int stride = w - l;
    Mset ms;
    for (int i = 0; i < l - 1; ++i) {
      ms.add(b[i]);
      if (ms.size() > stride + 1) {
        ms.pop();
      }
      addSeg(i, i, max(ms.max(), i < stride ? 0 : -INF));
    }
    ms = Mset();
    for (int i = 0; i < l - 1; ++i) {
      ms.add(b[l - 1 - i]);
      if (ms.size() > stride + 1) {
        ms.pop();
      }
      if (w - 1 - i <= l - 2) {
        break;
      }
      addSeg(w - 1 - i, w - 1 - i, max(ms.max(), i < stride ? 0 : -INF));
    }
  }
  for (int i = 1; i < w; ++i) {
    ans[i] += ans[i - 1];
  }
  for (int i = 0; i < w; ++i) {
    cout << ans[i] << " ";
  }
  cout << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  solve(true);
  return 0;
}
