#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define F first
#define S second
#define pii pair < int, int >
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const int N = 3e5+10;
string s;
int n, m, v;
vector < pii > adj[N];
int vis[N];
int sol[N];
int dep[N];
pair < pii, int > input( void ) {
cin >> s;
pair < pii, int > out;
int temp = 0;
for(int i = 0; i < (int) s.size(); i++) {
if(s[i] >= '0' && s[i] <= '9') temp = temp*10 + s[i] - '0';
else {
out.F.F = temp;
temp = 0;
if(s[i] == '>') out.S = -1;
if(s[i] == '<') out.S = 1;
if(s[i] == '=') out.S = 0;
}
}
out.F.S = temp;
return out;
}
void dfs( int x, int v ) {
if(vis[x]) return;
vis[x] = 1;
dep[x] = 0;
pii sus;
for(int i = 0; i < (int) adj[x].size(); i++) {
sus = adj[x][i];
if(sus.S == v) {
dfs(sus.F, v);
dep[x] = max(dep[x], dep[sus.F] + 1);
}
}
for(int i = 0; i < (int) adj[x].size(); i++) {
sus = adj[x][i];
if(sus.S == 0) {
if(vis[sus.F] == 0) {
dfs(sus.F, v);
vis[sus.F] = 0;
}
dep[x] = max(dep[x], dep[sus.F]);
}
}
for(int i = 0; i < (int) adj[x].size(); i++) {
sus = adj[x][i];
if(sus.S == 0) dfs(sus.F, v);
}
return;
}
void task( void ) {
cin >> n >> m >> v;
pair < pii, int > temp;
for(int i = 0; i < v; i++) {
temp = input();
adj[--temp.F.F].pb(mp(--temp.F.S, temp.S));
adj[temp.F.S].pb(mp(temp.F.F, -temp.S));
}
for(int i = 0; i < m; i++) dfs(i, 1);
for(int i = 0; i < m; i++) {
vis[i] = 0;
sol[i] = dep[i];
dep[i] = 0;
}
for(int i = 0; i < m; i++) dfs(i, -1);
for(int i = 0; i < m; i++) sol[i] += dep[i];
for(int i = 0; i < m; i++) {
if(sol[i] == n - 1) cout << "K" << dep[i] + 1 << "\n";
else cout << "?\n";
}
return;
}
int main( void ) {
FIO;
int tt = 1;
while(tt--) task();
return 0;
}