#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define repr(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define FORR(i, m, n) for (int i = (m); i >= (n); --i)
#define equals(a, b) (fabs((a) - (b)) < EPS)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const ll mod = 1000000007;
//const ll mod = 998244353;
const int inf = 1e9 + 10;
const ll INF = 1e18;
const ld EPS = 1e-10;
const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

template<class T> struct UnionFind {
  vector<ll> par; 
  vector<ll> siz;
  vector<T> diff_weight;
    
  UnionFind(ll sz_, T sum_unity = 0): par(sz_), siz(sz_, 1), diff_weight(sz_, sum_unity) {
    for (ll i = 0; i < sz_; ++i) par[i] = i;

  }
  void init(ll sz_, T sum_unity) {
    par.resize(sz_);
    siz.resize(sz_, 1);
    diff_weight.resize(sz_, sum_unity);
    for (ll i = 0; i < sz_; ++i) par[i] = i;
  }

  ll root(ll x) { 
    if (par[x] == x) {
      return x;
    }
    else {
      ll r = root(par[x]);
      diff_weight[x] += diff_weight[par[x]];
      return par[x] = r;
    }
  }

  T weight(ll x) {
    root(x);
    return diff_weight[x];
  }

  bool merge(ll x, ll y, T w) {
    w += weight(x);
    w -= weight(y);
    x = root(x);
    y = root(y);
    if (x == y) return false;
    if (siz[x] < siz[y]) {
      swap(x, y);
      w = -w;
    }
    siz[x] += siz[y];
    par[y] = x;
    diff_weight[y] = w;
    return true;
  }

  bool issame(ll x, ll y) {
    return root(x) == root(y);
  }

  ll size(ll x) {
    return siz[root(x)];
  }

  T diff(ll x, ll y) {
    return weight(y) - weight(x);
  }
};

ll n, m;

void solve() {
  UnionFind<ll> uf(n, 0);
  while (m--) {
    char t;
    cin >> t;

    if (t == '!') {
      ll a, b, w;
      cin >> a >> b >> w;
      a--, b--;

      uf.merge(a, b, w);
    }
    else {
      ll a, b;
      cin >> a >> b;
      a--, b--;

      if (uf.issame(a, b)) cout << uf.diff(a, b) << '\n';
      else cout << "UNKNOWN\n";
    }
  }
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(25);

  while (cin >> n >> m, n && m) {
    solve();
  }

  




  
  return 0;
}
