#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<complex>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define REP(a,b,c) for(int a=b,d=c; a<d; a++)
#define REPS(a,b,c) for(int a=b,d=c; a<=d; a++)
#define REPD(a,b,c) for(int a=b,d=c; a>=d; a--)
#define REPI(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
#define RESET(a,b) memset(a,b,sizeof(a))
#define ALL(a) a.begin(),a.end()
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
typedef complex<double> pt;
typedef vector<int> vi;
const int INF = 1000000000;
const double EPS = 1e-9;
//sicasli's template
map<string,int> id;
typedef struct
{
int pid,at,bw;
} lho;
lho par[100];
lho fpar(int p)
{
if (par[p].pid == p) return par[p];
lho tmp = fpar(par[p].pid);
int aa = par[p].at * tmp.at;
int bb = par[p].bw * tmp.bw;
int gg = __gcd(aa,bb);
par[p].pid = tmp.pid;
par[p].at = aa/gg;
par[p].bw = bb/gg;
return par[p];
}
void gabung(int a, int b, int xa, int xb)
{
lho para = fpar(a);
lho parb = fpar(b);
int aa = xb*parb.bw*para.at;
int bb = xa*parb.at*para.bw;
int gg = __gcd(aa,bb);
par[parb.pid].pid = para.pid;
par[parb.pid].at = aa/gg;
par[parb.pid].bw = bb/gg;
}
int main()
{
REP(i,0,100)
{
par[i].pid = i;
par[i].at = par[i].bw = 1;
}
char z[3];
int n = 0;
while (scanf("%s",z))
{
if (z[0]=='.') break;
if (z[0]=='!')
{
int a,b;
char sa[30],sb[30];
string SA,SB;
scanf("%d %s %*s %d %s",&a,sa,&b,sb);
int ida,idb,idc;
SA = (string)sa;
SB = (string)sb;
if (!id.count(SA)) id[SA] = n++;
if (!id.count(SB)) id[SB] = n++;
ida = id[SA];
idb = id[SB];
gabung(ida,idb,a,b);
lho para = fpar(ida);
lho parb = fpar(idb);
} else
{
int a,b;
char sa[30],sb[30];
string SA,SB;
scanf("%s %*s %s",sa,sb);
int ida,idb,idc;
SA = (string)sa;
SB = (string)sb;
if (!id.count(SA)) id[SA] = n++;
if (!id.count(SB)) id[SB] = n++;
ida = id[SA];
idb = id[SB];
lho para = fpar(ida);
lho parb = fpar(idb);
if (para.pid!=parb.pid)
{
printf("? %s = ? %s\n",sa,sb);
continue;
}
int aa = para.at*parb.bw;
int bb = para.bw*parb.at;
int gg = __gcd(aa,bb);
printf("%d %s = %d %s\n",aa/gg,sa,bb/gg,sb);
}
}
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxzdHJpbmc+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8c2V0PgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8Y29tcGxleD4KCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKCiNkZWZpbmUgUkVQKGEsYixjKSBmb3IoaW50IGE9YixkPWM7IGE8ZDsgYSsrKQojZGVmaW5lIFJFUFMoYSxiLGMpIGZvcihpbnQgYT1iLGQ9YzsgYTw9ZDsgYSsrKQojZGVmaW5lIFJFUEQoYSxiLGMpIGZvcihpbnQgYT1iLGQ9YzsgYT49ZDsgYS0tKQojZGVmaW5lIFJFUEkoaXQsYykgZm9yKF9fdHlwZW9mKChjKS5iZWdpbigpKSBpdD0oYykuYmVnaW4oKTsgaXQhPShjKS5lbmQoKTsgaXQrKykKI2RlZmluZSBSRVNFVChhLGIpIG1lbXNldChhLGIsc2l6ZW9mKGEpKQojZGVmaW5lIEFMTChhKSBhLmJlZ2luKCksYS5lbmQoKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCnR5cGVkZWYgbG9uZyBsb25nIExMOwp0eXBlZGVmIHBhaXI8aW50LGludD4gcGlpOwp0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBwdDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKIApjb25zdCBpbnQgSU5GID0gMTAwMDAwMDAwMDsKY29uc3QgZG91YmxlIEVQUyA9IDFlLTk7CiAKLy9zaWNhc2xpJ3MgdGVtcGxhdGUKCm1hcDxzdHJpbmcsaW50PiBpZDsKCnR5cGVkZWYgc3RydWN0CnsKCWludCBwaWQsYXQsYnc7Cn0gbGhvOwoKbGhvIHBhclsxMDBdOwoKbGhvIGZwYXIoaW50IHApCnsKCWlmIChwYXJbcF0ucGlkID09IHApIHJldHVybiBwYXJbcF07CglsaG8gdG1wID0gZnBhcihwYXJbcF0ucGlkKTsKCQoJaW50IGFhID0gcGFyW3BdLmF0ICogdG1wLmF0OwoJaW50IGJiID0gcGFyW3BdLmJ3ICogdG1wLmJ3OwoJaW50IGdnID0gX19nY2QoYWEsYmIpOwoJCglwYXJbcF0ucGlkID0gdG1wLnBpZDsKCXBhcltwXS5hdCA9IGFhL2dnOwoJcGFyW3BdLmJ3ID0gYmIvZ2c7CgkKCXJldHVybiBwYXJbcF07Cn0KCnZvaWQgZ2FidW5nKGludCBhLCBpbnQgYiwgaW50IHhhLCBpbnQgeGIpCnsJCglsaG8gcGFyYSA9IGZwYXIoYSk7CglsaG8gcGFyYiA9IGZwYXIoYik7CgkJCQoJaW50IGFhID0geGIqcGFyYi5idypwYXJhLmF0OwoJaW50IGJiID0geGEqcGFyYi5hdCpwYXJhLmJ3OwoJaW50IGdnID0gX19nY2QoYWEsYmIpOwoJCglwYXJbcGFyYi5waWRdLnBpZCA9IHBhcmEucGlkOwoJcGFyW3BhcmIucGlkXS5hdCA9IGFhL2dnOwoJcGFyW3BhcmIucGlkXS5idyA9IGJiL2dnOwp9CgppbnQgbWFpbigpCnsKCVJFUChpLDAsMTAwKQoJewoJCXBhcltpXS5waWQgPSBpOwoJCXBhcltpXS5hdCA9IHBhcltpXS5idyA9IDE7Cgl9CgkKCWNoYXIgelszXTsKCWludCBuID0gMDsKCXdoaWxlIChzY2FuZigiJXMiLHopKQoJewoJCWlmICh6WzBdPT0nLicpIGJyZWFrOwoJCWlmICh6WzBdPT0nIScpCgkJewoJCQlpbnQgYSxiOwoJCQljaGFyIHNhWzMwXSxzYlszMF07CgkJCXN0cmluZyBTQSxTQjsKCQkJCgkJCXNjYW5mKCIlZCAlcyAlKnMgJWQgJXMiLCZhLHNhLCZiLHNiKTsKCQkJCgkJCWludCBpZGEsaWRiLGlkYzsKCQkJU0EgPSAoc3RyaW5nKXNhOwoJCQlTQiA9IChzdHJpbmcpc2I7CgkJCQoJCQlpZiAoIWlkLmNvdW50KFNBKSkgaWRbU0FdID0gbisrOwoJCQlpZiAoIWlkLmNvdW50KFNCKSkgaWRbU0JdID0gbisrOwoJCQkKCQkJaWRhID0gaWRbU0FdOwoJCQlpZGIgPSBpZFtTQl07CgkJCQoJCQlnYWJ1bmcoaWRhLGlkYixhLGIpOwoJCQkKCQkJbGhvIHBhcmEgPSBmcGFyKGlkYSk7CgkJCWxobyBwYXJiID0gZnBhcihpZGIpOwoJCX0gZWxzZQoJCXsKCQkJaW50IGEsYjsKCQkJY2hhciBzYVszMF0sc2JbMzBdOwoJCQlzdHJpbmcgU0EsU0I7CgkJCQoJCQlzY2FuZigiJXMgJSpzICVzIixzYSxzYik7CgkJCQoJCQlpbnQgaWRhLGlkYixpZGM7CgkJCVNBID0gKHN0cmluZylzYTsKCQkJU0IgPSAoc3RyaW5nKXNiOwoJCQkKCQkJaWYgKCFpZC5jb3VudChTQSkpIGlkW1NBXSA9IG4rKzsKCQkJaWYgKCFpZC5jb3VudChTQikpIGlkW1NCXSA9IG4rKzsKCQkJCgkJCWlkYSA9IGlkW1NBXTsKCQkJaWRiID0gaWRbU0JdOwoJCQkKCQkJbGhvIHBhcmEgPSBmcGFyKGlkYSk7CgkJCWxobyBwYXJiID0gZnBhcihpZGIpOwoJCQkKCQkJaWYgKHBhcmEucGlkIT1wYXJiLnBpZCkKCQkJewoJCQkJcHJpbnRmKCI/ICVzID0gPyAlc1xuIixzYSxzYik7CgkJCQljb250aW51ZTsJCgkJCX0KCQkJCgkJCWludCBhYSA9IHBhcmEuYXQqcGFyYi5idzsKCQkJaW50IGJiID0gcGFyYS5idypwYXJiLmF0OwoJCQlpbnQgZ2cgPSBfX2djZChhYSxiYik7CgkJCQoJCQlwcmludGYoIiVkICVzID0gJWQgJXNcbiIsYWEvZ2csc2EsYmIvZ2csc2IpOwkKCQl9Cgl9CglyZXR1cm4gMDsKfQo=