#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
/*
    离散对数
    传入a,b,p,返回a^x % p = b 的最小解x,若无解返回-1.
	代码中把b>=p的情况判为无解
*/
int pow_mod(int a,long long b,int p) {
    int r=1;
    if (p==1) return 0;
    for(;b;b>>=1,a=(long long)a*a%p)
        if (b&1) r=(long long)r*a%p;
    return r;
}

int phi(int n) {
    int i,m=n;
    for(i=2;n/i>=i;i++) if (n%i==0) {
        m=m/i*(i-1);
        while(n%i==0) n/=i;
    }
    if (n>1) m=m/n*(n-1);
    return m;
}

map <int,int> Mp;

int logorithm(int a,int b,int p) {
    if (b>=p) return -1;
    Mp.clear();
    int r=0,d,i,j,t1,t2,m=(int)ceil(sqrt(p)+1e-9),m1;
    if (p==1) return 0;
    for(i=0,t1=1;i<32;i++) {
        if (t1==b) return i;
        t1=(long long)t1*a%p;
    }
    for(t1=d=1;__gcd((long long)t1*a%p,p*1LL)!=d;r++) {
        t1=(long long)t1*a%p;
        d=__gcd(t1,p);
    }
    if (b%d!=0) return -1;
    if (t1==b) return r;
    Mp[t1]=0;
    int pre=t1;
    for(i=1;i<m;i++){
        int tmp=1LL*pre*a%p;
        if (!Mp.count(tmp)) Mp[tmp]=i;
        pre=tmp;
        if (tmp==b) return r+i;
    }
    m1=phi(p/d);
    m1=pow_mod(a,m1-m%m1,p);
    for(i=1;i<m;i++) {
        b=(long long)b*m1%p;
        map <int,int>::iterator it=Mp.find(b);
        if (it!=Mp.end()) return i*m+it->second+r;
    }
    return -1;
}

//扩展Euclid求解gcd(a,b)=ax+by
int extGcd(int a, int b, int & x, int & y) {
    int t, ret;
    if (!b) {
        x = 1;
        y = 0;
        return a;
    }
    ret = extGcd(b, a % b, x, y);
    t = x;
    x = y;
    y = t - a / b * y;
    return ret;
}
int inverse(int a,int p){
	int x,y;
	return extGcd(a,p,x,y)==1 ? (x+p)%p : 0;
}
int main(){
	int n;
	scanf("%d",&n);
	int a,x,y,sz,ans;
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&x,&y,&a);
		sz=x;
		sz=sz*y;
		if(sz==a){
			puts("IMPOSSIBLE!");
			continue;
		}	
		LL p=__gcd(a,sz);
		sz/=p;
		if(sz%2==0){
			puts("IMPOSSIBLE!");
			continue;
		}	
		int inv=inverse(2,sz);
		ans=logorithm(2,inv,sz);
		if(ans==-1)
			puts("IMPOSSIBLE!");
		else	printf("%d\n",ans+1);
	}
	return 0;
}