#include <bits/stdc++.h>
using namespace std;
const long long inf = 1LL << 60;
long long res = inf;
long long dp[2][(1 << 20) + 1];
long long n, m, b;
struct data {
  long long x, k, mask;
  data(long long x, long long k, long long mask) : x(x), k(k), mask(mask) {}
  data() { x = k = mask = 0; }
  bool operator<(const data &d) const {
    if (k != d.k) return k < d.k;
    return x < d.x;
  }
};
vector<data> ve;
long long solve() {
  for (int i = 0; i <= 1; i++)
    for (int j = (1 << m) - 1; j >= 0; j--) dp[i][j] = inf;
  bool roll = 0;
  for (int i = n - 1; i >= 0; i--) {
    for (int j = (1 << m) - 1; j >= 0; j--) {
      if (j == (1 << m) - 1) {
        dp[roll ^ 1][j] = ve[i].k * b;
        continue;
      }
      dp[roll][j] =
          min(dp[roll ^ 1][j], ve[i].x + dp[roll ^ 1][j | ve[i].mask]);
    }
    roll = !roll;
  }
  res = dp[!roll][0];
  return (res == inf ? -1 : res);
}
int main() {
  scanf("%lld%lld%lld", &n, &m, &b);
  for (int i = 0; i < n; i++) {
    int x, k, sz;
    scanf("%d%d%d", &x, &k, &sz);
    int mask = 0;
    for (int j = 0; j < sz; j++) {
      int p;
      scanf("%d", &p);
      p--;
      mask |= (1 << p);
    }
    ve.push_back(data(x, k, mask));
  }
  sort(ve.begin(), ve.end());
  printf("%lld\n", solve());
  return 0;
}
