#include <time.h>
#include <ctime>
#include <random>
#include <fstream>
#include <numeric>
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;

unordered_set<long long> SviDelioci(long long Broj)
{
	unordered_set<long long> delioci = unordered_set<long long>();
	delioci.reserve(10000);
	long long trenutniDel = 1;
	long long poslednjiDelilac = 1;
	while (trenutniDel * trenutniDel <= Broj)
	{
		if (Broj % trenutniDel == 0) {
			delioci.insert(trenutniDel);
			poslednjiDelilac = trenutniDel;
		}
		trenutniDel++;
	}
	if (Broj % poslednjiDelilac == 0)
	{
		delioci.insert(Broj / poslednjiDelilac);
	}
	return delioci;
}
long long trazeniProizvod, trazeniXor;
long long nadjeniX, nadjeniY;
bool MogucXor(unordered_set<long long> Delioci)
{
	for (auto i = Delioci.begin(); i != Delioci.end(); i++)
	{
		long long x = *i;
		long long y = trazeniProizvod / x;
		if ((x^y) == trazeniXor)
		{
			nadjeniX = x;
			nadjeniY = y;
			return true;
		}
	}
	return false;
}
int main() 
{
	int brojTestova;
	cin >> brojTestova;
	for (int i = 0; i < brojTestova; i++)
	{
		cin >> trazeniProizvod >> trazeniXor;
		auto sviDelioci = SviDelioci(trazeniProizvod);
		if (MogucXor(sviDelioci))
		{
			cout << nadjeniX << " " << nadjeniY;
		}
		else
		{
			cout << "-1";
		}
	}
	return 0;
}