import sys

# sys.setrecursionlimit(200005)
# sys.set_int_max_str_digits(200005)
int1 = lambda x: int(x)-1
pDB = lambda *x: print(*x, end="\n", file=sys.stderr)
p2D = lambda x: print(*x, sep="\n", end="\n\n", file=sys.stderr)
def II(): return int(sys.stdin.readline())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def LI1(): return list(map(int1, sys.stdin.readline().split()))
def LLI1(rows_number): return [LI1() for _ in range(rows_number)]
def SI(): return sys.stdin.readline().rstrip()

dij = [(0, 1), (-1, 0), (0, -1), (1, 0)]
# dij = [(0, 1), (-1, 0), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]
# inf = -1-(-1 << 31)
inf = -1-(-1 << 62)

# md = 10**9+7
md = 998244353

from collections import deque

class MaxFlow():
    def __init__(self, n):
        self.n = n
        self.graph = [[] for _ in range(n)]
        self.pos = []

    def add_edge(self, fr, to, cap):
        m = len(self.pos)
        self.pos.append((fr, len(self.graph[fr])))
        fr_id = len(self.graph[fr])
        to_id = len(self.graph[to])
        if fr == to: to_id += 1
        self.graph[fr].append([to, to_id, cap])
        self.graph[to].append([fr, fr_id, 0])
        return m

    def get_edge(self, idx):
        to, rev, cap = self.graph[self.pos[idx][0]][self.pos[idx][1]]
        rev_to, rev_rev, rev_cap = self.graph[to][rev]
        return rev_to, to, cap + rev_cap, rev_cap

    def edges(self):
        m = len(self.pos)
        for i in range(m):
            yield self.get_edge(i)

    def dfs(self, s, t, up):
        stack = [t]
        while stack:
            v = stack.pop()
            if v == s:
                flow = up
                for v in stack:
                    to, rev, cap = self.graph[v][self.iter[v]]
                    flow = min(flow, self.graph[to][rev][2])
                for v in stack:
                    self.graph[v][self.iter[v]][2] += flow
                    to, rev, cap = self.graph[v][self.iter[v]]
                    self.graph[to][rev][2] -= flow
                return flow
            lv = self.level[v]
            for i in range(self.iter[v], len(self.graph[v])):
                to, rev, cap = self.graph[v][i]
                if lv > self.level[to] and self.graph[to][rev][2]:
                    self.iter[v] = i
                    stack.append(v)
                    stack.append(to)
                    break
            else:
                self.iter[v] = len(self.graph[v])
                self.level[v] = self.n
        return 0

    def max_flow(self, s, t):
        return self.max_flow_with_limit(s, t, 2**63 - 1)

    def max_flow_with_limit(self, s, t, limit):
        flow = 0
        while flow < limit:
            self.level = [-1] * self.n
            self.level[s] = 0
            queue = deque()
            queue.append(s)
            while queue:
                v = queue.popleft()
                for to, rev, cap in self.graph[v]:
                    if cap == 0 or self.level[to] >= 0: continue
                    self.level[to] = self.level[v] + 1
                    if to == t: break
                    queue.append(to)
            if self.level[t] == -1: break
            self.iter = [0] * self.n
            while flow < limit:
                f = self.dfs(s, t, limit - flow)
                if not f: break
                flow += f
        return flow

class CostScalingGraph():
    def __init__(self, n):
        self.n = n
        self.edges = []
        self.excess = [0] * n
        self.maxcost = 0
        self.graph = [[] for _ in range(self.n)]
        self.pos = []
        self.dual = [0] * n

    def add_edge(self, fr, to, lower, upper, cost):
        self.maxcost = max(self.maxcost, cost, -cost)
        self.edges.append([fr, to, lower, upper, 0, cost])

    def add_excess(self, v, x):
        self.excess[v] += x

    def solve(self):
        mf = MaxFlow(self.n + 2)
        sv = self.n
        tv = self.n + 1
        for fr, to, lower, upper, flow, cost in self.edges:
            self.excess[to] += lower
            self.excess[fr] -= lower
            mf.add_edge(fr, to, upper - lower)
        excess_s_sum = excess_t_sum = 0
        for i in range(self.n):
            if self.excess[i] > 0:
                excess_s_sum += self.excess[i]
                mf.add_edge(sv, i, self.excess[i])
            if self.excess[i] < 0:
                excess_t_sum -= self.excess[i]
                mf.add_edge(i, tv, -self.excess[i])
        if excess_s_sum != excess_t_sum or mf.max_flow(sv, tv) != excess_s_sum:
            return False, 0
        m = len(self.edges)
        for i in range(m):
            fr, to, cap, flow = mf.get_edge(i)
            cost = self.edges[i][5] * (self.n + 1)
            fr_id = len(self.graph[fr])
            to_id = len(self.graph[to])
            if fr == to: to_id += 1
            self.pos.append([fr, fr_id])
            self.graph[fr].append([to, to_id, cap - flow, cost])
            self.graph[to].append([fr, fr_id, flow, -cost])
        self.eps = (self.n + 1) * self.maxcost
        while self.eps > 1:
            self.eps = max(self.eps >> 2, 1)
            self.refine()
        res = 0
        for i in range(m):
            fr, _, lower, upper, flow, cost = self.edges[i]
            to, rev, cap, _ = self.graph[self.pos[i][0]][self.pos[i][1]]
            self.edges[i][4] = upper - cap
            res += (upper - cap) * cost
        self.dual = [0] * self.n
        while True:
            update = False
            for i in range(self.n):
                for to, rev, cap, cost in self.graph[i]:
                    if cap == 0: continue
                    cost = self.dual[i] + cost // (self.n + 1)
                    if cost < self.dual[to]:
                        self.dual[to] = cost
                        update = True
            if not update: break
        return True, res

    def refine(self):
        excess = [0] * self.n
        for u in range(self.n):
            for v, e in enumerate(self.graph[u]):
                to, rev, cap, cost = e
                if cap != 0 and cost + self.dual[u] - self.dual[to] < 0:
                    excess[u] -= cap
                    excess[to] += cap
                    self.graph[to][rev][2] += cap
                    self.graph[u][v][2] -= cap
        actives_on = [False] * self.n
        actives = deque()
        iter = [0] * self.n
        for i in range(self.n):
            if excess[i] > 0:
                actives.append(i)
                actives_on[i] = True
        while actives:
            u = actives.popleft()
            actives_on[u] = False
            for i in range(iter[u], len(self.graph[u])):
                to, rev, cap, cost = self.graph[u][i]
                if cap != 0 and cost + self.dual[u] - self.dual[to] < 0:
                    cap = min(excess[u], cap)
                    excess[u] -= cap
                    excess[to] += cap
                    self.graph[to][rev][2] += cap
                    self.graph[u][i][2] -= cap
                    if not actives_on[to] and excess[to] > 0:
                        actives_on[to] = True
                        actives.append(to)
                    if excess[u] == 0:
                        iter[u] = i
                        break
            else:
                iter[u] = len(self.graph[u])
            if excess[u] > 0:
                iter[u] = 0
                down = (self.n + 1) * self.maxcost
                for to, rev, cap, cost in self.graph[u]:
                    if cap != 0:
                        down = min(down, self.eps + cost + self.dual[u] - self.dual[to])
                self.dual[u] -= down
                actives.append(u)
                actives_on[u] = True
        self.eps = 0
        for u in range(self.n):
            for to, rev, cap, cost in self.graph[u]:
                if cap != 0:
                    self.eps = max(self.eps, -cost - self.dual[u] + self.dual[to])
mx=10**9
n,k=LI()
mf=CostScalingGraph(n)
aa=[]
for i in range(n):
    if i:mf.add_edge(i-1,i,0,n,mx)
    a,m=LI()
    aa.append(a)
    for j in LI1():
        if j<i and aa[j]<a:
            mf.add_edge(j,i,0,1,mx*(i-j)-a+aa[j])
mf.add_excess(0,k)
mf.add_excess(n-1,-k)
f=mf.solve()
ans = mx*(n-1)*k-f[1]

print(ans)