#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+7;
int n,m,d,mt,cnt,sid[150],ans[N],deg[N];
string t,s[N];
map<int,int>pos;
vector<int>G[N];
int calc(string s)
{
	int ret=0;
	for(int i=0;i<s.size();i++)ret=ret*28+sid[s[i]];
	return ret;
}
int main()
{
	for(int i=0;i<26;i++)sid[i+'a']=i;sid['_']=27;
	cin>>n>>m>>d;
	for(int i=1;i<=n;i++)cin>>s[i];
	for(int i=1;i<=n;i++)pos[calc(s[i])]=i;
	for(int i=1;i<=m;i++)
	{
		cin>>t;scanf("%d",&mt);
		bool has=0;
		for(int S=0;S<(1<<d);S++)
		{
			string tt=t;
			for(int j=0;j<t.size();j++)if((S>>j)&1)tt[j]='_';
			int val=calc(tt);
			if(pos.find(val)!=pos.end())
			{
				if(pos[val]==mt)has=1;
				else G[mt].push_back(pos[val]),deg[pos[val]]++;
			}
		}
		if(!has){puts("NO");return 0;}
	}
	queue<int>q;
	for(int i=1;i<=n;i++)if(!deg[i])q.push(i);
	while(q.size())
	{
		int u=q.front();q.pop();
		ans[++cnt]=u;
		for(int i=0;i<G[u].size();i++)if(!(--deg[G[u][i]]))q.push(G[u][i]);
	}
	if(cnt<n)puts("NO");
	else{
		puts("YES");
		for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	}
}