int N, M, INF = 10000000, vis[100001], dis[100001], U[100001], V[100001];
vector<pii> G[100001];
void solve() {
rep(i, N)G[i].clear(), vis[i] = 0;
UnionFind uf(N);
vi knd(M);
rep(i, M) {
int u, v;
char s[2];
scanf("%s%d%d", s, &u, &v);
char c = s[0];
--u; --v;
if (c == '!') {
int w; scanf("%d", &w);
if (uf.find(u) != uf.find(v)) {
G[u].emplace_back(v, w);
G[v].emplace_back(u, -w);
uf.unite(u, v);
}
knd[i] = -INF;
} else {
if (uf.find(u) != uf.find(v)) {
knd[i] = INF;
} else {
U[i] = u; V[i] = v;
}
}
}
rep(i, N)if (!vis[i]) {
stack<tuple<int, int, int> > stk;
stk.push(mt(i, -1, 0));
while (sz(stk)) {
int u, p, d;
tie(u, p, d) = stk.top(); stk.pop();
vis[u] = 1;
dis[u] = d;
each(e, G[u])if (e.first != p)stk.push(mt(e.first, u, d + e.second));
}
}
rep(i, M) {
if (knd[i] == INF)puts("UNKNOWN");
else if (knd[i] != -INF)printf("%d\n", dis[V[i]] - dis[U[i]]);
}
}
int main(){
while (scanf("%d%d", &N, &M), N) {
solve();
}
}