#include <bits/stdc++.h>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#define all(x) x.begin(), x.end()
#define ll long long
#define pii pair<int,int>
#define V vector
#define pb push_back
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr);
const int N = 3e5 + 5;
int bg[N], sm[N];
V<pii> adjb[N], adjs[N];
bool v[N];
void dfs1(int node, V<bool>& vis) {
vis[node] = true;
v[node] = true;
for (auto [i, bs] : adjb[node])
if (!vis[i])
dfs1(i, vis);
for (auto [i, bs] : adjb[node])
bg[i] = max(bg[i], bg[node] + bs);
}
void dfs2(int node, V<bool>& vis) {
vis[node] = true;
v[node] = true;
for (auto [i, bs] : adjs[node])
if (!vis[i])
dfs2(i, vis);
for (auto [i, bs] : adjs[node])
sm[i] = max(sm[i], sm[node] + bs);
}
void reun(int node, V<bool>& vis) {
vis[node] = true;
v[node] = true;
for (auto [i, bs] : adjb[node])
if (!vis[i])
reun(i, vis);
for (auto [i, bs] : adjb[node]) {
if (bs == 0) {
int mx_bg = max(bg[i], bg[node]);
int mx_sm = max(sm[i], sm[node]);
bg[i] = bg[node] = mx_bg;
sm[i] = sm[node] = mx_sm;
}
}
}
int main() {
FASTIO
int n, m, q;
cin >> n >> m >> q;
V<pii> b, s, e;
for (int i = 1; i <= q; i++) {
int a, c;
char x;
cin >> a >> c >> x;
if (x == '>') {
b.pb({a, c});
s.pb({c, a});
}
else if (x == '<') {
s.pb({a, c});
b.pb({c, a});
}
else
e.pb({a, c});
}
for (auto [x, y] : b)
adjb[x].pb({y, 1});
for (auto [x, y] : e) {
adjb[x].pb({y, 0});
adjb[y].pb({x, 0});
adjs[x].pb({y, 0});
adjs[y].pb({x, 0});
}
for (int i = 1; i <= m; i++) v[i] = false;
V<bool> vis1(m + 1, false);
for (int i = 1; i <= m; i++)
if (!v[i])
dfs1(i, vis1);
for (int i = 1; i <= m; i++) v[i] = false;
V<bool> vis2(m + 1, false);
for (int i = 1; i <= m; i++)
if (!v[i])
dfs2(i, vis2);
for (int i = 1; i <= m; i++) v[i] = false;
V<bool> vis3(m + 1, false);
for (int i = 1; i <= m; i++)
if (!v[i])
reun(i, vis3);
for (int i = 1; i <= m; i++) {
if (bg[i] + sm[i] == n - 1)
cout << 'K' << sm[i] + 1 << "\n";
else
cout << "?\n";
}
}