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

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1e5;

int N, M, K;
vector<int> adj[MAXN+10];
unordered_map<string, int> MM;

bool cyc=false;
int vis[MAXN+10];

vector<int> S;
void dfs(int now)
{
	vis[now]=1;
	for(int nxt : adj[now])
	{
		if(vis[nxt]==1) cyc=true;
		else if(vis[nxt]==0) dfs(nxt);
	}
	vis[now]=2;
	S.push_back(now);
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin>>N>>M>>K;
	for(int i=1; i<=N; i++)
	{
		string P;
		cin>>P;
		MM[P]=i;
	}

	for(int i=1; i<=M; i++)
	{
		string S; int T;
		cin>>S>>T;
		vector<int> V;
		for(int j=0; j<(1<<K); j++)
		{
			string SS=S;
			for(int k=0; k<K; k++)
			{
				if(j&(1<<k)) SS[k]='_';
			}
			if(MM.find(SS)!=MM.end())
			{
				V.push_back(MM[SS]);
			}
		}
		bool flag=false;
		for(auto it : V) if(it==T) flag=true;
		if(!flag) return !printf("NO\n");
		for(auto it : V)
		{
			if(it==T) continue;
			adj[T].push_back(it);
		}
	}

	for(int i=1; i<=N; i++) if(vis[i]==0) dfs(i);
	reverse(S.begin(), S.end());

	if(cyc) return !printf("NO\n");

	printf("YES\n");
	for(auto it : S) printf("%d ", it);
}