#include <bits/stdc++.h>
using namespace std;
long long int spf[10000005], gum[100005], dum[100005];
map<long long int, long long int> a, b, g;
void inp(long long int n, map<long long int, long long int> &m,
         long long int st[]) {
  for (long long int i = 0; i < n; i++) {
    scanf("%lld", &st[i]);
    long long int k = st[i];
    while (k != 1) {
      if (m.find(spf[k]) != m.end()) m.insert({spf[k], 0});
      m[spf[k]]++;
      k /= spf[k];
    }
  }
}
void out(long long int n, long long int arr[],
         map<long long int, long long int> m) {
  for (long long int i = 0; i < n; i++) {
    long long int t = arr[i];
    while (t != 1) {
      if (m.find(spf[t]) != m.end() && m[spf[t]] > 0) {
        arr[i] /= spf[t];
        m[spf[t]]--;
      }
      t /= spf[t];
    }
  }
}
int main() {
  long long int n, m;
  scanf("%lld%lld", &n, &m);
  for (long long int i = 0; i < 10000005; i++) spf[i] = i;
  for (long long int i = 2; i * i <= 10000000; i++)
    if (spf[i] == i) {
      for (long long int j = i * i; j <= 10000000; j += i)
        if (spf[j] == j) spf[j] = i;
    }
  inp(n, a, gum);
  inp(m, b, dum);
  for (auto it = a.begin(); it != a.end(); it++)
    if (b.find(it->first) != b.end())
      g.insert({it->first, min(it->second, b[it->first])});
  out(n, gum, g);
  out(m, dum, g);
  printf("%lld %lld\n", n, m);
  for (long long int i = 0; i < n; i++) printf("%lld ", gum[i]);
  printf("\n");
  for (long long int i = 0; i < m; i++) printf("%lld ", dum[i]);
}
