#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>

#define msn(x) (memset((x),0,sizeof((x))))
#define msx(x) (memset((x),0x7f,sizeof((x))))
#define fuck(x) cerr << #x << " <- " << x << endl
#define acer cout<<"sb"<<endl
typedef long long ll;
using namespace std;
const int maxn=1e5+7;
struct node
{
    int v,d;
};
vector<int>g[maxn];
int n,m;

int fa[maxn],siz[maxn];
int dis[maxn];
int anc(int a)////謇セ辷ク辷ク
{
	if(fa[a]==a)return a;
	fa[a]=anc(fa[a]);
	return fa[a];
}
void uni(int aa,int bb,int w)///霑樊磁
{
	int a=anc(aa);
	int b=anc(bb);
	if(siz[a]<=siz[b])swap(a,b),swap(aa,bb),w=-w;
	int sb=w+dis[aa]-dis[bb];
	fa[b]=a;
	for(int i=0;i<g[b].size();i++)
    {
        dis[g[b][i]]=sb+dis[g[b][i]];
        g[a].push_back(g[b][i]);
    }
	siz[a]+=siz[b];
}
void ini1()//蟷カ譟・髮??蟋句喧
{
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		siz[i]=1;
		dis[i]=0;
		g[i].clear();
		g[i].push_back(i);
	}
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)break;
    ini1();
    char ope[5];
    int u,v,w;
    for(int i=0;i<m;i++)
    {
        scanf("%s",ope);
        if(ope[0]=='!')
        {
            scanf("%d%d%d",&u,&v,&w);
            if(anc(u)!=anc(v))
            {
                uni(u,v,-w);
            }
        }
        else
        {
            scanf("%d%d",&u ,&v);
            if(anc(u)!=anc(v))printf("UNKNOWN\n");
            else printf("%d\n",dis[u]-dis[v]);
       }
    }
    }

    return 0;
}