import java.util.*;
import java.lang.*;

class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{
    	Scanner in = new Scanner(System.in);
		
		while(in.hasNext()) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		}
	}
} import java.util.*; util.* java import java.lang.*; lang.* java class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{
    	Scanner in = new Scanner(System.in);
		
		while(in.hasNext()) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		}
	}
} Main public static void main (String[] args) throws java.lang.Exception
	{
    	Scanner in = new Scanner(System.in);
		
		while(in.hasNext()) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		}
	} main {
    	Scanner in = new Scanner(System.in);
		
		while(in.hasNext()) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		}
	} Scanner in = new Scanner(System.in); in new Scanner(System.in) while(in.hasNext()) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		} in.hasNext() in.hasNext in {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		} int x = in.nextInt(); x in.nextInt() in.nextInt in int y = in.nextInt(); y in.nextInt() in.nextInt in int greatCD = 1; greatCD 1 int cd = 2; cd 2 int min = x < y ? x : y; min x < y ? x : y x < y x y x y while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			} cd <= min cd min { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			} for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				} cd = 2; cd = 2 cd 2 cd <= min cd min cd++ cd++ cd {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				} {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				} if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					} (x % cd) == 0 && (y % cd) == 0 (x % cd) == 0 (x % cd) x cd 0 (y % cd) == 0 (y % cd) y cd 0 {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					} x = x / cd x x / cd x cd y = y / cd y y / cd y cd greatCD = greatCD * cd greatCD greatCD * cd greatCD cd min = min / cd min min / cd min cd break; int lcd = greatCD * x * y; lcd greatCD * x * y greatCD * x * y greatCD x y System.out.printf("%d %d\n", greatCD, lcd) System.out.printf System.out System System.out "%d %d\n" greatCD lcd String[] args args
import java.util.*;
import java.lang.*;

class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{
    	Scanner in = new Scanner(System.in);
		
		while(in.hasNext()) {
			int x = in.nextInt();
			int y = in.nextInt();
			
			int greatCD = 1; // 最大公約数
			int cd = 2;      // 公約数
			int min = x < y ? x : y;
			
			while(cd <= min) { 	
				for(cd = 2; cd <= min; cd++) {
					// cdはxとyの公約数か判断。
					if ((x % cd) == 0 && (y % cd) == 0) {
						//cdが公約数だったら、xとyをcdで割り、次の計算に備える。
						x = x / cd;
						y = y / cd;
						greatCD = greatCD * cd; // 算出した公約数を今まで求めた公約数の値に掛け合わせる
						min = min / cd;
						break;
					}
				}
			}
			
			// 最小公倍数は、最大公約数と最後に算出したxとyの値を掛け合わせることで算出できる。
			int lcd = greatCD * x * y;
			
	   		System.out.printf("%d %d\n", greatCD, lcd);
		}
	}
}