#include <bits/stdc++.h>
using namespace std;
int num[10001000], den[10001000];
long long arra[100100], arrb[100100];
int n, m;
bool isprime[10001000];
void init() {
  memset(isprime, 0, sizeof(isprime));
  for (int i = 2; i <= 10000000; i++) {
    if (!isprime[i]) {
      for (int j = i * 2; j <= 10000000; j += i) isprime[j] = 1;
    }
  }
}
void work(int val, int *arr) {
  for (int i = 2; isprime[val] && i * i <= val; i++) {
    while (!(val % i)) {
      arr[i]++;
      val /= i;
    }
  }
  if (val > 1) arr[val]++;
}
void print(int val, int *arr) {
  int ans = 1;
  for (int i = 2; isprime[val] && i * i <= val; i++)
    while (!(val % i)) {
      if (arr[i]) {
        arr[i]--;
        ans *= i;
      }
      val /= i;
    }
  if (val > 1 && arr[val]) {
    arr[val]--;
    ans *= val;
  }
  printf("%d", ans);
}
int main() {
  init();
  scanf("%d%d", &n, &m);
  memset(num, 0, sizeof(num));
  memset(den, 0, sizeof(den));
  for (int i = 0; i < n; i++) {
    scanf("%d", arra + i);
    work(arra[i], num);
  }
  for (int i = 0; i < m; i++) {
    scanf("%d", arrb + i);
    work(arrb[i], den);
  }
  for (int i = 2; i < 10000000; i++)
    if (num[i] >= den[i]) {
      num[i] -= den[i];
      den[i] = 0;
    } else {
      den[i] -= num[i];
      num[i] = 0;
    }
  printf("%d %d\n", n, m);
  print(arra[0], num);
  for (int i = 1; i < n; i++) {
    putchar(' ');
    print(arra[i], num);
  }
  putchar(10);
  print(arrb[0], den);
  for (int i = 1; i < m; i++) {
    putchar(' ');
    print(arrb[i], den);
  }
  putchar(10);
  return 0;
}
