#include using namespace std; using int64 = long long; //const int mod = 1e9 + 7; const int mod = 998244353; const int64 infll = (1LL << 62) - 1; const int inf = (1 << 30) - 1; struct IoSetup { IoSetup() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(10); cerr << fixed << setprecision(10); } } iosetup; template< typename T1, typename T2 > ostream &operator<<(ostream &os, const pair< T1, T2 > &p) { os << p.first << " " << p.second; return os; } template< typename T1, typename T2 > istream &operator>>(istream &is, pair< T1, T2 > &p) { is >> p.first >> p.second; return is; } template< typename T > ostream &operator<<(ostream &os, const vector< T > &v) { for(int i = 0; i < (int) v.size(); i++) { os << v[i] << (i + 1 != v.size() ? " " : ""); } return os; } template< typename T > istream &operator>>(istream &is, vector< T > &v) { for(T &in: v) is >> in; return is; } template< typename T1, typename T2 > inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); } template< typename T1, typename T2 > inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); } template< typename T = int64 > vector< T > make_v(size_t a) { return vector< T >(a); } template< typename T, typename... Ts > auto make_v(size_t a, Ts... ts) { return vector< decltype(make_v< T >(ts...)) >(a, make_v< T >(ts...)); } template< typename T, typename V > typename enable_if< is_class< T >::value == 0 >::type fill_v(T &t, const V &v) { t = v; } template< typename T, typename V > typename enable_if< is_class< T >::value != 0 >::type fill_v(T &t, const V &v) { for(auto &e: t) fill_v(e, v); } template< typename F > struct FixPoint : F { FixPoint(F &&f) : F(forward< F >(f)) {} template< typename... Args > decltype(auto) operator()(Args &&... args) const { return F::operator()(*this, forward< Args >(args)...); } }; template< typename F > inline decltype(auto) MFP(F &&f) { return FixPoint< F >{forward< F >(f)}; } template< typename CapType, typename CostType > class MinCostFlowDAG { public: using Cat = CapType; using Cot = CostType; using pti = pair< Cot, int >; struct edge { int to, rev; Cat cap; Cot cost; }; const int V; const Cot inf; vector< vector< edge > > G; vector< Cot > h, dist; vector< int > deg, ord, prevv, preve; MinCostFlowDAG(const int node_size) : V(node_size), inf(numeric_limits< Cot >::max()), G(V), h(V, inf), dist(V), deg(V, 0), prevv(V), preve(V) {} void add_edge(const int from, const int to, const Cat cap, const Cot cost) { if(cap == 0) return; G[from].push_back((edge) {to, (int) G[to].size(), cap, cost}); G[to].push_back((edge) {from, (int) G[from].size() - 1, 0, -cost}); ++deg[to]; } bool tsort() { queue< int > que; for(int i = 0; i < V; ++i) { if(deg[i] == 0) que.push(i); } while(!que.empty()) { const int p = que.front(); que.pop(); ord.push_back(p); for(auto &e: G[p]) { if(e.cap > 0 && --deg[e.to] == 0) que.push(e.to); } } return (*max_element(deg.begin(), deg.end()) == 0); } void calc_potential(const int s) { h[s] = 0; for(const int v: ord) { if(h[v] == inf) continue; for(const edge &e: G[v]) { if(e.cap > 0) h[e.to] = min(h[e.to], h[v] + e.cost); } } } void Dijkstra(const int s) { priority_queue< pti, vector< pti >, greater< pti > > que; fill(dist.begin(), dist.end(), inf); dist[s] = 0; que.push(pti(0, s)); while(!que.empty()) { pti p = que.top(); que.pop(); const int v = p.second; if(dist[v] < p.first) continue; for(int i = 0; i < (int) G[v].size(); ++i) { edge &e = G[v][i]; if(e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) { dist[e.to] = dist[v] + e.cost + h[v] - h[e.to]; prevv[e.to] = v, preve[e.to] = i; que.push(pti(dist[e.to], e.to)); } } } } void update(const int s, const int t, Cat &f, Cot &res) { for(int i = 0; i < V; i++) { if(dist[i] != inf) h[i] += dist[i]; } Cat d = f; for(int v = t; v != s; v = prevv[v]) { d = min(d, G[prevv[v]][preve[v]].cap); } f -= d; res += h[t] * d; for(int v = t; v != s; v = prevv[v]) { edge &e = G[prevv[v]][preve[v]]; e.cap -= d; G[v][e.rev].cap += d; } } Cot solve(const int s, const int t, Cat f) { if(!tsort()) assert(false); // not DAG calc_potential(s); Cot res = 0; while(f > 0) { Dijkstra(s); if(dist[t] == inf) return -1; update(s, t, f, res); } return res; } }; int main() { int N, K; cin >> N >> K; MinCostFlowDAG< int, int64 > mcf(N + N + 2); const int S = N + N; const int T = N + N + 1; for(int i = 0; i < N; i++) { int a, m; cin >> a >> m; mcf.add_edge(i == 0 ? S : N + i, i, K, a); for(int j = 0; j < m; j++) { int b; cin >> b; --b; mcf.add_edge(b, i, 1, 0); } mcf.add_edge(i, i + 1 == N ? T : N + i + 1, K, -a); mcf.add_edge(N + i, i + 1 == N ? T : N + i + 1, K, 0); } cout << -mcf.solve(S, T, K) << "\n"; }