#include <bits/stdc++.h>
using namespace std;
int prime[10000005] = {0}, c1[10000005], c2[10000005];
int n, m, a[100005], b[100005];
void Prime() {
  for (int i = 2; i < 10000005; i++) {
    if (prime[i]) continue;
    for (int j = 2; j * i < 10000005; j++) prime[i * j] = 1;
  }
}
void split(int num, int c[]) {
  for (int i = 2; i * i <= num && prime[num]; i++) {
    while (num % i == 0) {
      c[i]++;
      num /= i;
    }
  }
  if (num > 1) c[num]++;
}
void print(int num, int c[]) {
  int tmp = 1;
  for (int i = 2; i * i <= num && prime[num]; i++) {
    while (num % i == 0) {
      if (c[i]) {
        c[i]--;
        tmp *= i;
      }
      num /= i;
    }
  }
  if (num > 1 && c[num]) {
    c[num]--;
    tmp *= num;
  }
  printf("%d ", tmp);
}
int main() {
  Prime();
  while (scanf("%d%d", &n, &m) != EOF) {
    memset(c1, 0, sizeof(0));
    memset(c2, 0, sizeof(0));
    for (int i = 0; i < n; i++) {
      scanf("%d", &a[i]);
      split(a[i], c1);
    }
    for (int i = 0; i < m; i++) {
      scanf("%d", &b[i]);
      split(b[i], c2);
    }
    for (int i = 2; i < 10000005; i++) {
      int mm = min(c1[i], c2[i]);
      c1[i] -= mm;
      c2[i] -= mm;
    }
    printf("%d %d\n", n, m);
    for (int i = 0; i < n; i++) print(a[i], c1);
    printf("\n");
    for (int i = 0; i < m; i++) print(b[i], c2);
    printf("\n");
  }
  return 0;
}
