#include <bits/stdc++.h>
using namespace std;
#define int long long
const int sz = 3e5 + 5;
int n, m, q;
vector<int> g[sz];
int r[sz], par[sz];
vector<bool> used(sz);
int find_par(int node){
if(node == par[node]){
return node;
}return par[node] = find_par(par[node]);
}
void unite(int u, int v){
int par_u = find_par(u);
int par_v = find_par(v);
if(par_u == par_v){
return;
}
if(r[par_u] < r[par_v]){
swap(par_u, par_v);
}par[par_v] = par_u;
r[par_u] += r[par_v];
}
vector<int> tp;
void dfs(int node){
used[node] = 1;
for(auto i: g[node]){
if(!used[i]){
dfs(i);
}
}tp.push_back(node);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> q;
for(int i = 1; i <= m; i++){
r[i] = 1;
par[i] = i;
}
vector<pair<int, int>> w;
for(int i = 0; i < q; i++){
int u, v;
char c;
cin >> u >> c >> v;
if(c == '='){
unite(u, v);
}else {
w.push_back({u, v});
}
}
for(auto i: w){
int par_u = find_par(i.first);
int par_v = find_par(i.second);
if(par_u != par_v){
g[par_u].push_back(par_v);
}
}for(int i = 1; i <= m; i++){
if(!used[i]){
dfs(i);
}
}vector<int> suff(m+1, 0), pref(m+1, 0);
for(auto i: tp){
for(auto v: g[i]){
suff[i] = max(suff[i], suff[v] + 1);
}
}reverse(tp.begin(), tp.end());
for(auto i: tp){
for(auto v: g[i]){
pref[v] = max(pref[v], pref[i] + 1);
}
}
for(int i = 1; i <= m; i++){
int par_i = find_par(i);
if(pref[par_i] + suff[par_i] + 1 == n){
cout << 'K' << pref[par_i]+1 << endl;
}else {
cout << "?\n";
}
}
return 0;
}