#include <bits/stdc++.h>
using namespace std;
const int INF =
    sizeof(int) == sizeof(long long) ? 0x3f3f3f3f3f3f3f3fLL : 0x3f3f3f3f;
const int MOD = (int)(1e9) + 7;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
struct Dinic {
  using Flow = int;
  struct Edge {
    int to, rev;
    Flow cap;
    Edge() {}
    Edge(int to, int rev, Flow cap) : to(to), rev(rev), cap(cap) {}
  };
  int n;
  vector<vector<Edge>> g;
  vector<bool> used;
  vector<int> level;
  vector<int> iter;
  Dinic(int n) : n(n), g(n), used(n), level(n), iter(n){};
  void addArc(int from, int to, Flow cap) {
    g[from].emplace_back(to, (int)g[to].size(), cap);
    g[to].emplace_back(from, (int)g[from].size() - 1, 0);
  }
  void addEdge(int a, int b, Flow cap) {
    g[a].emplace_back(b, (int)g[b].size(), cap);
    g[b].emplace_back(a, (int)g[a].size() - 1, cap);
  }
  Flow maximumFlow(int s, int t) {
    Flow total = 0;
    while (true) {
      levelize(s);
      if (level[t] < 0) return total;
      fill(iter.begin(), iter.end(), 0);
      Flow f;
      while (true) {
        f = augment(s, t, INF);
        if (f == 0) break;
        total += f;
      }
    }
  }
  Flow augment(int v, int t, Flow f) {
    if (v == t) return f;
    for (int &i = iter[v]; i < g[v].size(); i++) {
      Edge &e = g[v][i];
      if (e.cap > 0 && level[v] < level[e.to]) {
        Flow d = augment(e.to, t, min(f, e.cap));
        if (d > 0) {
          e.cap -= d;
          g[e.to][e.rev].cap += d;
          return d;
        }
      }
    }
    return 0;
  }
  void levelize(int s) {
    fill(level.begin(), level.end(), -1);
    queue<int> q;
    level[s] = 0;
    q.push(s);
    while (q.size()) {
      int v = q.front();
      q.pop();
      for (int i = 0; i < g[v].size(); i++) {
        Edge &e = g[v][i];
        if (e.cap > 0 && level[e.to] < 0) {
          level[e.to] = level[v] + 1;
          q.push(e.to);
        }
      }
    }
  }
};
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  for (int N, W; cin >> N >> W && N;) {
    Dinic dinic(7 + N + 2);
    int src = 7 + N, snk = src + 1;
    for (int i = (0); i < (7); i++) dinic.addArc(src, i, W);
    int total = 0;
    for (int i = (0); i < (N); i++) {
      int t, c;
      cin >> t >> c;
      total += t;
      dinic.addArc(7 + i, snk, t);
      for (int j = (0); j < (c); j++) {
        string s;
        cin >> s;
        if (s == "Sunday")
          dinic.addArc(0, 7 + i, W);
        else if (s == "Monday")
          dinic.addArc(1, 7 + i, W);
        else if (s == "Tuesday")
          dinic.addArc(2, 7 + i, W);
        else if (s == "Wednesday")
          dinic.addArc(3, 7 + i, W);
        else if (s == "Thursday")
          dinic.addArc(4, 7 + i, W);
        else if (s == "Friday")
          dinic.addArc(5, 7 + i, W);
        else if (s == "Saturday")
          dinic.addArc(6, 7 + i, W);
      }
    }
    cout << (dinic.maximumFlow(src, snk) == total ? "Yes" : "No") << endl;
  }
  return 0;
}
