#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e5+10;

vector<int>e[N];
int in[N];
string p[N];
map<string,int>mp;
int k;
vector<int>ans;

bool match(string s1,string s2){
	for(int i=0;i<k;i++){
		if(s1[i]=='_') continue;
		if(s1[i]!=s2[i]) return 0;
	}
	return 1;
}

int main()
{
	//ios::sync_with_stdio(0);
	//cin.tie(0);
	int n,m;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		cin>>p[i];
		mp[p[i]]=i;
	}
	string s;
	for(int i=1;i<=m;i++){
		int mt;
		cin>>s>>mt;
		if(!match(p[mt],s)){
			printf("NO\n");
			return 0;
		}
		for(int j=0;j<(1<<k);j++){
			string t;
			for(int l=0;l<k;l++){
				if(j&(1<<l)){
					t+='_';
				}
				else t+=s[l];
			}
			if(mp.find(t)!=mp.end()&&mp[t]!=mt){
				e[mt].push_back(mp[t]);
				in[mp[t]]++;
			}
		}
	}
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(!in[i]) q.push(i);
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		ans.push_back(u);
		for(auto v: e[u]){
			if(--in[v]==0){
				q.push(v);
			}
		}
	}
	if(ans.size()<n) printf("NO\n");
	else{
		printf("YES\n");
		for(int i=0;i<n;i++){
			printf("%d%c",ans[i],i==n-1? '\n':' ');
		}
	}
	return 0;
}