#include <bits/stdc++.h>
using namespace std;
int nom[100005], dem[100005], primes[1000006] = {2}, cnt = 1, n, m;
map<int, int> cnom, cdem, com, factsup[100005], factsdn[100005];
int p[10000007];
void sieve() {
  for (int i = 1; i <= 10000000; i++) {
    p[i] = i;
  }
  for (int i = 2; i <= 3163; i++) {
    if (p[i] == i) {
      for (int j = i + i; j <= 10000000; j += i) {
        p[j] = min(p[j], i);
      }
    }
  }
}
void fact(int num, map<int, int> &m1, map<int, int> &m2) {
  do {
    m1[p[num]]++;
    m2[p[num]]++;
    num /= p[num];
  } while (num > 1);
}
int main() {
  sieve();
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &nom[i]);
    fact(nom[i], cnom, factsup[i]);
  }
  for (int i = 0; i < m; i++) {
    scanf("%d", &dem[i]);
    fact(dem[i], cdem, factsdn[i]);
  }
  for (auto it : cnom) {
    com[it.first] = min(it.second, cdem[it.first]);
  }
  for (auto it : cdem) {
    com[it.first] = min(it.second, cnom[it.first]);
  }
  map<int, int> tmp = com;
  for (int i = 0; i < n; i++) {
    for (auto it : factsup[i]) {
      int mn = min(it.second, com[it.first]);
      it.second -= mn;
      com[it.first] -= mn;
      while (mn--) {
        nom[i] /= it.first;
      }
    }
  }
  for (int i = 0; i < m; i++) {
    for (auto it : factsdn[i]) {
      int mn = min(it.second, tmp[it.first]);
      it.second -= mn;
      tmp[it.first] -= mn;
      while (mn--) {
        dem[i] /= it.first;
      }
    }
  }
  printf("%d %d\n", n, m);
  for (int i = 0; i < n; i++) printf("%d ", nom[i]);
  puts("");
  for (int i = 0; i < m; i++) printf("%d ", dem[i]);
  return 0;
}
