#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define m(a,b) a>b?b:a
bool isprime(ll num) {
if (num == 1 || num == 4)return 0;
if (num == 2 || num == 3)return 1;
ll temp = ll(sqrt(num));
if (temp == sqrt(num)) {
for (int i = 2; i <= temp; i++) {
if (num % i == 0)return 0;
}
return 1;
}
else {
for (int i = 2; i <= temp; i++) {
if (num % i == 0)return 0;
}
return 1;
}
}
int main() {
vector<ll> a, b;
ll numa, numb,lcm,gcd=1;
cin >> numa >> numb;
ll tempa = numa, tempb = numb;
for (ll i = 2; i <= tempa;) {
if (isprime(tempa)) {
a.push_back(tempa);
break;
}
if (tempa % i == 0) {
tempa /= i;
a.push_back(i);
i = 2;
}
else i++;
}
for (ll i = 2; i <=tempb;) {
if (isprime(tempb)) {
b.push_back(tempb);
break;
}
if (tempb % i == 0) {
tempb /= i;
b.push_back(i);
i = 2;
}
else i++;
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
for (ll i = 2;i<=10000; i++) {
if (find(a.begin(), a.end(), i) != a.end() && find(b.begin(), b.end(), i) != b.end()) {
gcd = i;
break;
}
}
if (numa > numb) {
if (numa % numb == 0)lcm = numa;
else lcm = numa > numb ? b[0] * numa : a[0] * numb;
}
else {
if (numb % numa == 0)lcm = numb;
else lcm = numa > numb ? b[0] * numa : a[0] * numb;
}
std::cout<<gcd<<' ' << lcm;
}