import java.util.Scanner;


public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	}
	static int GCD(int a, int b){
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	}
	static int LCM(int a, int b){
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	}
} import java.util.Scanner; Scanner java.util public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	}
	static int GCD(int a, int b){
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	}
	static int LCM(int a, int b){
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	}
} Main public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	} main {
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		} true {
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		} if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; } sc.hasNextInt() sc.hasNextInt sc {	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} int a = sc.nextInt(); a sc.nextInt() sc.nextInt sc int b = sc.nextInt(); b sc.nextInt() sc.nextInt sc System.out.println(GCD(a,b)+" "+LCM(a,b)) System.out.println System.out System System.out GCD(a,b)+" "+LCM(a,b) GCD(a,b)+" "+LCM(a,b) GCD(a,b) GCD a b " " LCM(a,b) LCM a b { break; } break; String[] args args static int GCD(int a, int b){
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	} GCD {
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	} int gcd =1; gcd 1 if(a==b){
			return a;
		} a==b a b {
			return a;
		} return a; a int gcdSup = Math.max(a, b)/2; gcdSup Math.max(a, b)/2 Math.max(a, b) Math.max Math a b 2 for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		} int i=2; int i=2; i 2 i<=gcdSup i gcdSup i++ i++ i {
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		} {
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		} if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			} a%i==0 a%i a i 0 {		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			} if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				} b%i==0 b%i b i 0 {  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				} gcd = i gcd i return gcd; gcd int a a int b b static int LCM(int a, int b){
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	} LCM {
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	} int lcm = -1; lcm -1 1 int aTimes = a; aTimes a int bTimes = b; bTimes b while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		} true {
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		} while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				} aTimes < bTimes aTimes bTimes {
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				} aTimes = aTimes + a * ((bTimes - aTimes)/a) aTimes aTimes + a * ((bTimes - aTimes)/a) aTimes a * ((bTimes - aTimes)/a) a ((bTimes - aTimes)/a) (bTimes - aTimes) bTimes aTimes a if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える aTimes==bTimes aTimes bTimes {
						return aTimes;
					} return aTimes; aTimes { aTimes += a; } aTimes += a aTimes a while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				} bTimes < aTimes bTimes aTimes {
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				} bTimes = bTimes + b * ((aTimes - bTimes)/b) bTimes bTimes + b * ((aTimes - bTimes)/b) bTimes b * ((aTimes - bTimes)/b) b ((aTimes - bTimes)/b) (aTimes - bTimes) aTimes bTimes b if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; } aTimes==bTimes aTimes bTimes {
						return aTimes;
					} return aTimes; aTimes { bTimes += b; } bTimes += b bTimes b if (aTimes == bTimes){ return aTimes;} aTimes == bTimes aTimes bTimes { return aTimes;} return aTimes; aTimes if (aTimes > 2000000000){
					break;
				} aTimes > 2000000000 aTimes 2000000000 {
					break;
				} break; return lcm; lcm int a a int b b public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	}
	static int GCD(int a, int b){
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	}
	static int LCM(int a, int b){
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	}
} public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	}
	static int GCD(int a, int b){
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	}
	static int LCM(int a, int b){
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	}
} Main
import java.util.Scanner;


public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(true){
			if(sc.hasNextInt()){	//EOFについたらifが成り立たずbreakする
				int a = sc.nextInt();
				int b = sc.nextInt();
				System.out.println(GCD(a,b)+" "+LCM(a,b)); //公約数と公倍数を求めるメソッドは別に用意する
			} else { break; }
		}
	}
	static int GCD(int a, int b){
		int gcd =1;
		if(a==b){
			return a;
		}
		int gcdSup = Math.max(a, b)/2; //aとbの大きい方の半分
		for(int i=2; i<=gcdSup; i++){
			if(a%i==0){		//iがaの因数である場合
				if(b%i==0){  //iがbの因数である場合
					gcd = i; //iを新しい公約数として更新
				}
			}
		}
		return gcd;
	}
	static int LCM(int a, int b){
		int lcm = -1;
		int aTimes = a;
		int bTimes = b;
		while(true){
				while(aTimes < bTimes){
					aTimes = aTimes + a * ((bTimes - aTimes)/a) ;  //aの倍数がbの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { aTimes += a; }	//これをするとaの倍数がbの倍数を超える
				}
				while(bTimes < aTimes){
					bTimes = bTimes + b * ((aTimes - bTimes)/b);  //bの倍数がaの倍数に追い付くか抜くまで増やす
					if(aTimes==bTimes){
						return aTimes;
					} else { bTimes += b; }
				}
				if (aTimes == bTimes){ return aTimes;}
				if (aTimes > 2000000000){
					break;
				}
		}
		return lcm;
	}
}