#include <bits/stdc++.h>
using namespace std;
const long long N = 1001000;
const long long M = 4 * N;
const long long Inf = 1e18;
long long w;
long long a[N];
long long Tree[M];
long long Lazy[M];
void Merge(long long Node) {
  Tree[Node] = Tree[(2 * Node)] + Tree[(2 * Node + 1)];
}
void PushLazy(long long Node, long long Len) {
  if (Lazy[Node]) {
    Tree[Node] += Len * Lazy[Node];
    if (Len > 1) {
      Lazy[(2 * Node)] += Lazy[Node];
      Lazy[(2 * Node + 1)] += Lazy[Node];
    }
    Lazy[Node] = 0;
  }
}
void Update(long long i, long long j, long long x, long long Node = 1,
            long long L = 1, long long R = w) {
  PushLazy(Node, R - L + 1);
  if (j < L || R < i) return;
  if (i <= L && R <= j) {
    Lazy[Node] += x;
    return PushLazy(Node, R - L + 1);
  }
  Update(i, j, x, (2 * Node), L, ((L + R) / 2));
  Update(i, j, x, (2 * Node + 1), ((L + R) / 2) + 1, R);
  Merge(Node);
}
long long Get(long long i, long long j, long long Node = 1, long long L = 1,
              long long R = w) {
  PushLazy(Node, R - L + 1);
  if (j < L || R < i) return 0;
  if (i <= L && R <= j) return Tree[Node];
  return Get(i, j, (2 * Node), L, ((L + R) / 2)) +
         Get(i, j, (2 * Node + 1), ((L + R) / 2) + 1, R);
}
pair<long long, long long> GetRange(long long i, long long n) {
  if (i == 0) return pair<long long, long long>(1, w - n);
  if (i == n + 1) return pair<long long, long long>(w - (w - n) + 1, w);
  return pair<long long, long long>(i, i + (w - n));
}
set<long long> Used;
priority_queue<pair<long long, long long> > q;
int main() {
  long long rep;
  cin >> rep >> w;
  while (rep--) {
    long long n;
    scanf("%I64d", &n);
    for (long long i = 1; i <= n; i++) scanf("%I64d", a + i);
    a[0] = a[n + 1] = 0;
    for (long long i = 1; i <= n; i++)
      q.push(pair<long long, long long>(a[i], i));
    if (n < w)
      q.push(pair<long long, long long>(a[0], 0)),
          q.push(pair<long long, long long>(a[n + 1], n + 1));
    while (!q.empty()) {
      pair<long long, long long> Cur = q.top();
      q.pop();
      long long i = Cur.second;
      long long L = GetRange(i, n).first, R = GetRange(i, n).second;
      set<long long>::iterator it = Used.lower_bound(i);
      if (it != Used.end()) {
        long long j = *it;
        R = min(R, GetRange(j, n).first - 1);
      }
      if (it != Used.begin()) {
        it--;
        long long j = *it;
        L = max(L, GetRange(j, n).second + 1);
      }
      if (L <= R) Update(L, R, a[i]);
      Used.insert(i);
    }
    Used.clear();
  }
  for (long long i = 1; i <= w; i++) printf("%I64d ", Get(i, i));
}
