#pragma GCC optimize(2) #include #define all(n) (n).begin(), (n).end() #define se second #define fi first #define pb emplace_back #define mp make_pair #define sqr(n) ((n)*(n)) #define rep(i, a, b) for (int i = (a); i <= (b); ++i) #define per(i, a, b) for (int i = (a); i >= (b); --i) #define precision(a) setiosflags(ios::fixed) << setprecision(a) #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair PII; typedef pair PLL; typedef vector VI; typedef vector VL; typedef double db; template inline char read(T &x) { x = 0; T fg = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == '-') fg = -1;ch = getchar();} while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ '0'), ch = getchar(); x = fg * x; return ch; } template inline void read(T &x, Args &... args) { read(x), read(args...); } template inline void write(T x) { int len = 0; char c[40]; if (x < 0) putchar('-'), x = -x; do{++len; c[len] = x % 10 + '0';} while (x /= 10); for (int i = len; i >= 1; i--) putchar(c[i]); } template inline void write(T& x, Args &... args) { write(x), write(args...); } template bool umin(T1& a, T2 b) { return a > b ? (a = b, true) : false; } template bool umax(T1& a, T2 b) { return a < b ? (a = b, true) : false; } template void clear(T& a) { T().swap(a); } const int N = 1e5 + 5; int n, m, _, k, cas; int main() { IOS; for (cin >> _; _; --_) { cin >> n >> m; if (n == m && n > 1) { cout << 2 << ' ' << n << '\n'; continue; } n = max(m, n) - min(n, m); if (n <= 1) cout << "-1 -1\n"; else { int a = n; for (int i = 2; i <= n / i; ++i) if (n % i == 0) { a = i; break; } cout << a << ' ' << n << '\n'; } } return 0; }