#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
const int MAXN = 1e7 + 5;
bool v[MAXN];
int spf[MAXN];
unordered_map<int, int> pfa, pfb;
unordered_map<int, int> newpfa, newpfb;
void Sieve() {
  for (long long int i = 2; i < MAXN; i += 2) spf[i] = 2;
  for (long long int i = 3; i < MAXN; i += 2) {
    if (!v[i]) {
      spf[i] = i;
      for (long long int j = i; (j * i) < MAXN; j += 2) {
        if (!v[j * i]) {
          v[j * i] = true;
          spf[j * i] = i;
        }
      }
    }
  }
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  Sieve();
  int n, m;
  cin >> n >> m;
  int a[n];
  int b[m];
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    int u = a[i];
    while (u > 1) {
      pfa[spf[u]]++;
      newpfa[spf[u]]++;
      u = u / spf[u];
    }
  }
  for (int i = 0; i < m; i++) {
    cin >> b[i];
    int u = b[i];
    while (u > 1) {
      pfb[spf[u]]++;
      newpfb[spf[u]]++;
      u = u / spf[u];
    }
  }
  for (auto p : pfb) {
    int pr = p.first;
    newpfa[pr] = newpfa[pr] - min(pfa[pr], pfb[pr]);
    newpfb[pr] = newpfb[pr] - min(pfa[pr], pfb[pr]);
  }
  vector<int> ar;
  vector<int> br;
  for (int i = 0; i < n; i++) {
    int u = a[i];
    int v = 1;
    while (u > 1) {
      int fac = spf[u];
      if (newpfa[fac] > 0) v = v * fac;
      newpfa[fac]--;
      u = u / spf[u];
    }
    ar.emplace_back(v);
  }
  for (int i = 0; i < m; i++) {
    int u = b[i];
    int v = 1;
    while (u > 1) {
      int fac = spf[u];
      if (newpfb[fac] > 0) v = v * fac;
      newpfb[fac]--;
      u = u / spf[u];
    }
    br.emplace_back(v);
  }
  cout << ar.size() << " " << br.size() << "\n";
  for (auto x : ar) cout << x << " ";
  cout << "\n";
  for (auto x : br) cout << x << " ";
  return 0;
}
