#include<bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define vvi vector<vi>
#define eb emplace_back
#define pob pop_back
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define tomn(x,...) ((x)=min((x),__VA_ARGS__))
#define all(x) x.begin(),x.end()
struct node{
int i;
char hi;
int j;
char hj;
node(int a=0,char b=0,int c=0,char d=0):i(a),hi(b),j(c),hj(d){}
};
#define N 200005
vector<node>a;
vvi g(N);
int dnt,cnt,m;
vi sta,dfn(N),low(N),tmp(N);
bitset<N> vis;
string s;
map<pair<char,char>,int> mp;
map<pair<char,int>,char> up;
int n,d;
#define to(x,y) ((y)*n+(x))
void tarjan(int u){
dfn[u]=low[u]=++dnt;
sta.eb(u);
vis[u]=1;
for(int&v:g[u]){
if(!dfn[v]){
tarjan(v);
tomn(low[u],low[v]);
}else if(vis[v]) tomn(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int v=-1;
++cnt;
for(;u^v;){
vis[v=sta.back()]=0;
sta.pob();
tmp[v]=cnt;
}
}
}
bool hv=0;
void solve(){
vis=0;
cnt=dnt=0;
fill(all(dfn),0);
fill(all(low),0);
fill(all(tmp),0);
sta.clear();
for(auto&i:g) i.clear();
for(auto&[i,hi,j,hj]:a){
if(s[i]==hi) continue;
if(i==j&&hi==hj) continue;
if(s[j]==hj||i==j){
g[to(i,(mp[{s[i],hi}]))].eb(to(i,(!mp[{s[i],hi}])));
continue;
}
g[to(i,(mp[{s[i],hi}]))].eb(to(j,(mp[{s[j],hj}])));
g[to(j,(!mp[{s[j],hj}]))].eb(to(i,(!mp[{s[i],hi}])));
}
rep(i,1,2*n) if(!dfn[i]) tarjan(i);
rep(i,1,n){
if(tmp[i]==tmp[i+n]){
return;
}
}
rep(i,1,n){
int temp=(tmp[i]>tmp[i+n]);
cout<<up[{s[i],temp}];
}
exit(0);
}
vi xp(1);
main(){
#ifdef LOCAL
auto start=clock();
#endif
ios::sync_with_stdio(0),cin.tie(nullptr);
cin>>n>>d>>s;
s=" "+s;
rep(i,1,n){
if(s[i]=='x'){
xp.eb(i);
}
}
mp[{'a','B'}]=0;
mp[{'a','C'}]=1;
mp[{'b','A'}]=0;
mp[{'b','C'}]=1;
mp[{'c','A'}]=0;
mp[{'c','B'}]=1;
up[{'a',0}]='B';
up[{'a',1}]='C';
up[{'b',0}]='A';
up[{'b',1}]='C';
up[{'c',0}]='A';
up[{'c',1}]='B';
cin>>m;
a.resize(m);
for(auto&[i,hi,j,hj]:a){
cin>>i>>hi>>j>>hj;
}
rep(i,0,(1<<d)-1){
rep(j,1,d){
if((i>>(j-1))&1){
s[xp[j]]='a';
}else s[xp[j]]='b';
}
solve();
}
cout<<-1;
#ifdef LOCAL
clog<<"\ntime: "<<clock()-start<<" ms\n";
#endif
}