#include <bits/stdc++.h>
using namespace std;
const int Maxn = 105;
int pow2[25];
inline void init() {
  pow2[0] = 1;
  for (int i = 1; i < 25; i++) pow2[i] = pow2[i - 1] * 2;
}
int n, m;
long long B;
struct pNode {
  long long cost;
  long long moni;
  int solve;
};
pNode p[Maxn];
inline bool cmpNode(pNode a, pNode b) {
  if (a.moni < b.moni) return true;
  return false;
}
inline void input() {
  scanf("%d%d%I64d", &n, &m, &B);
  for (int i = 1; i <= n; i++) {
    int m;
    scanf("%I64d%I64d%d", &p[i].cost, &p[i].moni, &m);
    for (int j = 1; j <= m; j++) {
      int tmp;
      scanf("%d", &tmp);
      p[i].solve += pow2[tmp - 1];
    }
  }
  sort(p + 1, p + n + 1, cmpNode);
}
long long Ans = -1;
int maxLimi;
long long F[1 << 21];
inline void dp() {
  maxLimi = (1 << m) - 1;
  memset(F, -1, sizeof(F));
  F[0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int st = maxLimi; st >= 0; st--) {
      if (F[st] != -1) {
        int tst = st | p[i].solve;
        if (F[tst] == -1) {
          F[tst] = F[st] + p[i].cost;
        } else {
          F[tst] = min(F[tst], F[st] + p[i].cost);
        }
        if (tst == maxLimi) {
          if (Ans == -1) {
            Ans = F[tst] + p[i].moni * B;
          } else {
            Ans = min(Ans, F[tst] + p[i].moni * B);
          }
        }
      }
    }
  }
  printf("%I64d\n", Ans);
}
int main() {
  init();
  input();
  dp();
  return 0;
}
