#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <map>
using namespace std;
//英语 看博友分析 抄博友程序 并查集 巧妙 没掌握
struct frac{
int a,b;
};
int gcd(int a,int b)
{
if(b==0)
{
return a;
}else
{
return gcd(b,a%b);
}
}
frac init(int a,int b)//抄博友程序
{
int t=gcd(a,b);
frac jg;
jg.a=a/t;
jg.b=b/t;
return jg;
}
frac mul(frac x,frac y)
{
return init(x.a*y.a, x.b*y.b);
}
frac div(frac x,frac y)
{
return init(x.a*y.b, x.b*y.a);
}
map<string,int> mp;
int js;
int insert(string s)
{
if(mp.find(s)==mp.end())
{
mp[s]=js++;
}
return mp[s];
}
struct nod{
frac f;
int p;
}set[100];
int find(int x)//抄博友程序 没掌握
{
if(set[x].p==x)
{
return x;
}
int t=find(set[x].p);
//cout<<set[x].p<<" "<<t<<endl;//不相等
set[x].f=mul(set[set[x].p].f,set[x].f);//抄博友程序 没掌握 背
set[x].p=t;
return t;
}
int main()
{
js=1;
for(int i=0;i<100;i++)
{
set[i].f.a=set[i].f.b=1;
set[i].p=i;
}
while(1)
{
string op;
cin>>op;
if(op==".")
{
break;
}
if(op=="!")
{
int a,b;
string sa,sb,st;
cin>>a>>sa>>st>>b>>sb;
int ia=insert(sa);
int ib=insert(sb);
//cout<<"hi"<<endl;
find(ia);
int t=set[ia].p;
set[t].p=ib;
set[t].f=div(init(b,a),set[ia].f);//背
}else
{
string sa,st,sb;
cin>>sa>>st>>sb;
int ia=insert(sa);
int ib=insert(sb);
find(ia);
find(ib);
if(set[ia].p==set[ib].p)
{
frac t=div(set[ia].f,set[ib].f);//没掌握
cout<<t.b<<" "<<sa<<" = "<<t.a<<" "<<sb<<endl;
}else
{
cout<<"? "<<sa<<" = "<<"? "<<sb<<endl;
}
}
}
return 0;
}