#include<iostream>
#include<cassert>
#include<algorithm>
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define inf (1<<29)
#define MAX 3000000
using namespace std;
struct P
{
  int color,w;
  P(int color=-inf,int w=-inf):color(color),w(w){}
};
P par[MAX];
void init(){ rep(i,MAX)par[i] = P(i); }

P find(int x)
{
  if(x == par[x].color)return par[x];
  P p = find(par[x].color);
  if(par[x].w == -inf)par[x].w = 0;
  par[x].w += p.w,par[x].color = p.color;
  return par[x];
}

void unit(int x,int y,int w)//x <= y
{
  P X = find(x); 
  P Y = find(y);
  par[X.color].color = par[Y.color].color;
  if(par[X.color].w == -inf)par[X.color].w = 0;
  if(par[Y.color].w == -inf)par[Y.color].w = 0;
  par[X.color].w = par[X.color].w + (par[y].w-w - par[x].w);
}

int N,M;

int main()
{
  while(cin >> N >> M,N|M)
    {
      init();
      char c;
      int a,b,w;
      rep(_,M)
	{
	  cin >> c;
	  if(c == '!')
	    {
	      cin >> a >> b >> w;
	      unit(a,b,w);
	    }
	  else
	    {
	      cin >> a >> b;
	      P B = find(b);
	      P A = find(a);
	      if(B.color != A.color)cout << "UNKNOWN" << endl;
	      else cout << B.w-A.w << endl;
	    }
	}
    }
  return 0;
} 