#include <bits/stdc++.h>
using namespace std;
struct People {
  int mask;
  long long money, nMonitor;
} people[111];
bool operator<(const People &a, const People &b) {
  return a.nMonitor < b.nMonitor;
}
int nPeople, nProb, monitorCost;
long long f[2][(1 << (20))];
void update(long long &x, long long val) {
  if (val < 0) return;
  if (x < 0)
    x = val;
  else
    x = min(x, val);
}
int main() {
  ios ::sync_with_stdio(false);
  cin.tie(NULL);
  cout << (fixed) << setprecision(6);
  while (cin >> nPeople >> nProb >> monitorCost) {
    for (int i = (1), _b = (nPeople); i <= _b; i++) {
      people[i].mask = 0;
      int can;
      cin >> people[i].money >> people[i].nMonitor >> can;
      while (can--) {
        int u;
        cin >> u;
        people[i].mask |= (1 << (u - 1));
      }
    }
    sort(people + 1, people + nPeople + 1);
    memset(f, -1, sizeof f);
    f[0][0] = 0;
    long long cur = 0, res = -1;
    for (int i = (1), _b = (nPeople); i <= _b; i++) {
      for (int mask = 0, _a = ((1 << (nProb))); mask < _a; mask++)
        if (f[cur][mask] >= 0) {
          update(f[1 - cur][mask | people[i].mask],
                 f[cur][mask] + people[i].money);
          update(f[1 - cur][mask], f[cur][mask]);
        }
      int mask = (1 << (nProb)) - 1;
      if (f[1 - cur][mask] >= 0) {
        update(res, f[1 - cur][mask] + people[i].nMonitor * monitorCost);
      }
      cur = 1 - cur;
    }
    cout << res << endl;
  }
  return 0;
}
