import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
	public static void main(String[] args){
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	}
	
	//最大公約数を求めるメソッド
	static int getDivisor(int x, int y){
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	}
	//最小公倍数を求めるメソッド
	static int getMultiple(int x, int y){
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	}
} import java.io.BufferedReader; BufferedReader java.io import java.io.IOException; IOException java.io import java.io.InputStreamReader; InputStreamReader java.io import java.util.ArrayList; ArrayList java.util import java.util.Collections; Collections java.util public class Main {
	public static void main(String[] args){
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	}
	
	//最大公約数を求めるメソッド
	static int getDivisor(int x, int y){
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	}
	//最小公倍数を求めるメソッド
	static int getMultiple(int x, int y){
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	}
} Main public static void main(String[] args){
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	} main {
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	} String		str; str int a a b b multiple = 0 multiple 0 divisor = 0; divisor 0 ArrayList<String>	list	= new ArrayList<String>(); list new ArrayList<String>() ArrayList<Integer>	intList	= new ArrayList<Integer>(); intList new ArrayList<Integer>() try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} IOException e {
			e.printStackTrace();
		} e.printStackTrace() e.printStackTrace e {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in)); br new BufferedReader(new InputStreamReader(System.in)) while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			} (str=br.readLine())!=null (str=br.readLine()) str br.readLine() br.readLine br null {
				list.add(str);						//行単位でArrayListに追加
			} list.add(str) list.add list str br.close() br.close br for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		} int i=0; int i=0; i 0 i<list.size() i list.size() list.size list i++ i++ i {			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		} {			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		} String[] s = list.get(i).split(" "); s list.get(i).split(" ") list.get(i).split list.get(i) list.get list i " " for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			} int j=0; int j=0; j 0 j<s.length j s.length s s.length j++ j++ j {			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			} {			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			} intList.add(Integer.parseInt(s[j])) intList.add intList Integer.parseInt(s[j]) Integer.parseInt Integer s[j] s j Collections.sort(intList) Collections.sort Collections intList a = intList.get(0) a intList.get(0) intList.get intList 0 b = intList.get(1) b intList.get(1) intList.get intList 1 divisor = getDivisor(a,b) divisor getDivisor(a,b) getDivisor a b multiple = getMultiple(a,b) multiple getMultiple(a,b) getMultiple a b System.out.println(divisor + " " + multiple) System.out.println System.out System System.out divisor + " " + multiple divisor + " " + multiple divisor " " multiple intList.clear() intList.clear intList String[] args args //最大公約数を求めるメソッド
	static int getDivisor(int x, int y){
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	} getDivisor {
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	} if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		} x%y==0 x%y x y 0 {
			return y;
		} return y; y {
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		} int m = 1; m 1 while(m!=0){
				m = y%x;
				y = x;
				x = m;
			} m!=0 m 0 {
				m = y%x;
				y = x;
				x = m;
			} m = y%x m y%x y x y = x y x x = m x m return y; y int x x int y y //最小公倍数を求めるメソッド
	static int getMultiple(int x, int y){
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	} getMultiple {
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	} for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		} int i=1; int i=1; i 1 i<=x i x i++ i++ i {
			if(y*i%x==0){
				return y*i;
			}
		} {
			if(y*i%x==0){
				return y*i;
			}
		} if(y*i%x==0){
				return y*i;
			} y*i%x==0 y*i%x y*i y i x 0 {
				return y*i;
			} return y*i; y*i y i return 0; 0 int x x int y y public class Main {
	public static void main(String[] args){
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	}
	
	//最大公約数を求めるメソッド
	static int getDivisor(int x, int y){
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	}
	//最小公倍数を求めるメソッド
	static int getMultiple(int x, int y){
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	}
} public class Main {
	public static void main(String[] args){
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	}
	
	//最大公約数を求めるメソッド
	static int getDivisor(int x, int y){
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	}
	//最小公倍数を求めるメソッド
	static int getMultiple(int x, int y){
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	}
} Main
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
	public static void main(String[] args){
		String		str;
		int a,b,multiple = 0,divisor = 0;
		ArrayList<String>	list	= new ArrayList<String>();
		ArrayList<Integer>	intList	= new ArrayList<Integer>();
		try {
			BufferedReader br	=	new BufferedReader(new InputStreamReader(System.in));
			while((str=br.readLine())!=null){
				list.add(str);						//行単位でArrayListに追加
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		for(int i=0; i<list.size(); i++){			//一行文のデータ毎に処理する
			String[] s = list.get(i).split(" ");	//listの要素を空白で区切って配列を作成
			for(int j=0; j<s.length; j++){			//int型に変換してArrayListに追加
				intList.add(Integer.parseInt(s[j]));
			}
			Collections.sort(intList);				//小さい順に並べる

			a = intList.get(0);						//a,bを決める。a<bとなっている。
			b = intList.get(1);
			
			//最大公約数を求める
			divisor = getDivisor(a,b);

			//最小公倍数を求める
			multiple = getMultiple(a,b);
			
			//結果の表示
			System.out.println(divisor + " " + multiple);
			
			intList.clear();						//リストのクリア
		}
	}
	
	//最大公約数を求めるメソッド
	static int getDivisor(int x, int y){
		if(x%y==0){
			return y;
		}else{
			int m = 1;
			while(m!=0){
				m = y%x;
				y = x;
				x = m;
			}
			return y;
		}
	}
	//最小公倍数を求めるメソッド
	static int getMultiple(int x, int y){
		for(int i=1; i<=x; i++){
			if(y*i%x==0){
				return y*i;
			}
		}
		return 0;
	}
}