#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <string>
#include <queue>
using namespace std;

class Edge{
public:
	int to,rev;
	long long cap;
	Edge(int to,long long cap,int rev){
		this->to=to; this->cap=cap; this->rev=rev;
	}
};

const long long INF = 1L<<58;
int V;
vector<vector<Edge> > G;
vector<int> level,iter;

void addEdge(int from,int to,long long cap){
	G[from].push_back(Edge(to, cap, G[to].size()));
	G[to].push_back(Edge(from, 0, G[from].size()-1));
}

void D_bfs(int s){
	fill(begin(level), end(level), -1);
	queue<int> que;
	level[s] = 0;
	que.push(s);
	while(!que.empty()){
		int v = que.front();	que.pop();
		for(const Edge &e:G[v]){
			if(e.cap > 0 && level[e.to] < 0){
				level[e.to] = level[v]+1;
				que.push(e.to);
			}
		}
	}
}

long long D_dfs(int v,int t,long long 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]){
			long long d = 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;
}

long long Dinic(int s,int t){
	long long flow = 0;
	while(true){
		D_bfs(s);
		if(level[t] < 0)	return flow;
		fill(begin(iter), end(iter), 0);
		long long f=0;
		while( (f=D_dfs(s, t, INF)) > 0)	flow += f;
	}
}

int main(){
	int N;
	long long W;
	unordered_map<string, int> weeks;
	for(string s:{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"})	weeks.insert(make_pair(s, weeks.size()+1));
	while(true){
		cin>>N>>W;
		if(N==0)	break;

		V=10+N+1;
		level.resize(V,0);
		iter.resize(V,0);
		G.clear();
		G.resize(V,vector<Edge>());

		for(int i=1; i<=7; ++i)	addEdge(0,i,W);
		long long T,sum=0;
		int C;
		for(int i=0; i<N; ++i){
			cin>>T>>C;
			sum+=T;
			for(int j=0; j<C; ++j){
				string week;
				cin>>week;
				addEdge(weeks[week], 10+i, min(T,W));
			}
			addEdge(10+i, 10+N, T);
		}

		long long ret = Dinic(0,10+N);
		cout << (ret>=sum? "Yes": "No") << endl;

	}
	return 0;
}