#include <bits/stdc++.h>
using namespace std;
struct Dinic {
  const int INF = 1 << 28;
  struct edge {
    int to, cap, rev;
    edge() {}
    edge(int to, int cap, int rev) : to(to), cap(cap), rev(rev) {}
  };
  int n;
  vector<vector<edge> > G;
  vector<map<int, int> > M;
  vector<int> level, iter;
  Dinic() {}
  Dinic(int sz) : n(sz), G(n), M(n), level(n), iter(n) {}
  void add_edge(int from, int to, int cap) {
    M[from][to] = G[from].size();
    M[to][from] = G[to].size();
    G[from].push_back(edge(to, cap, G[to].size()));
    G[to].push_back(edge(from, 0, G[from].size() - 1));
  }
  void bfs(int s) {
    fill(level.begin(), level.end(), -1);
    queue<int> que;
    level[s] = 0;
    que.push(s);
    while (!que.empty()) {
      int v = que.front();
      que.pop();
      for (int i = 0; i < (int)G[v].size(); i++) {
        edge &e = G[v][i];
        if (e.cap > 0 && level[e.to] < 0) {
          level[e.to] = level[v] + 1;
          que.push(e.to);
        }
      }
    }
  }
  int dfs(int v, int t, int f) {
    if (v == t) return f;
    for (int &i = iter[v]; i < (int)G[v].size(); i++) {
      edge &e = G[v][i];
      if (e.cap > 0 && level[v] < level[e.to]) {
        int d = dfs(e.to, t, min(f, e.cap));
        if (d > 0) {
          e.cap -= d;
          G[e.to][e.rev].cap += d;
          return d;
        }
      }
    }
    return 0;
  }
  int flow(int s, int t, int lim) {
    int fl = 0;
    for (;;) {
      bfs(s);
      if (level[t] < 0 || lim == 0) return fl;
      fill(iter.begin(), iter.end(), 0);
      int f;
      while ((f = dfs(s, t, lim)) > 0) {
        fl += f;
        lim -= f;
      }
    }
  }
  int flow(int s, int t) { return flow(s, t, INF); }
  bool back_edge(int s, int t, int from, int to) {
    for (int i = 0; i < (int)G[from].size(); i++) {
      edge &e = G[from][i];
      if (e.to == to) {
        if (e.cap == 0 && flow(from, to, 1) == 0) {
          flow(from, s, 1);
          flow(t, to, 1);
          return 1;
        }
      }
    }
    return 0;
  }
};
map<string, int> m;
void init() {
  m["Sunday"] = 0;
  m["Monday"] = 1;
  m["Tuesday"] = 2;
  m["Wednesday"] = 3;
  m["Thursday"] = 4;
  m["Friday"] = 5;
  m["Saturday"] = 6;
}
int main() {
  init();
  int n, W, t, x, sum;
  while (cin >> n >> W, n) {
    sum = 0;
    Dinic d(n + 9);
    for (int i = 0; i < 7; i++) d.add_edge(n + 7, i, W);
    for (int i = 0; i < n; i++) {
      cin >> t >> x;
      sum += t;
      d.add_edge(i + 7, n + 8, t);
      for (int j = 0; j < x; j++) {
        string s;
        cin >> s;
        d.add_edge(m[s], i + 7, 1e8);
      }
    }
    if (sum == d.flow(n + 7, n + 8, 1e8))
      cout << "Yes" << endl;
    else
      cout << "No" << endl;
  }
}
