#include <bits/stdc++.h>
using namespace std;
const int oo = (int)1e9;
const double PI = 2 * acos(0.0);
const double eps = 1e-9;
const long long PRIMESZ = 10000010;
bool isprimes[PRIMESZ];
int nfactors[PRIMESZ], mfactors[PRIMESZ], nremoved[PRIMESZ], mremoved[PRIMESZ];
long long n, m, arrn[100010], arrm[100010], tarrn[100010], tarrm[100010];
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < (int)(n); ++i) cin >> arrn[i], tarrn[i] = arrn[i];
  for (int i = 0; i < (int)(m); ++i) cin >> arrm[i], tarrm[i] = arrm[i];
  vector<long long> primes;
  memset(isprimes, -1, sizeof(isprimes));
  isprimes[0] = isprimes[1] = false;
  for (int i = 0; i < (int)(PRIMESZ); ++i) {
    if (isprimes[i]) {
      if (i < 4000) primes.push_back(i);
      for (long long k = i * 2; k < PRIMESZ; k += i) isprimes[k] = false;
    }
  }
  for (int i = 0; i < (int)(n); ++i) {
    for (int k = 0; k < (int)(((long long)primes.size())); ++k) {
      while (arrn[i] % primes[k] == 0)
        arrn[i] /= primes[k], ++nfactors[primes[k]];
      if (isprimes[arrn[i]]) ++nfactors[arrn[i]], arrn[i] = 1;
      if (arrn[i] == 1) break;
    }
  }
  for (int i = 0; i < (int)(m); ++i) {
    for (int k = 0; k < (int)(((long long)primes.size())); ++k) {
      while (arrm[i] % primes[k] == 0)
        arrm[i] /= primes[k], ++mfactors[primes[k]];
      if (isprimes[arrm[i]]) ++mfactors[arrm[i]], arrm[i] = 1;
      if (arrm[i] == 1) break;
    }
  }
  for (int i = 0; i < (int)(PRIMESZ); ++i)
    nremoved[i] = mremoved[i] = min(nfactors[i], mfactors[i]);
  cout << n << " " << m << endl;
  for (int i = 0; i < (int)(n); ++i) {
    int div = tarrn[i];
    for (int k = 0; k < (int)(((long long)primes.size())); ++k) {
      while (nremoved[primes[k]] > 0 && tarrn[i] % primes[k] == 0)
        tarrn[i] /= primes[k], div /= primes[k], --nremoved[primes[k]];
      while (tarrn[i] % primes[k] == 0) tarrn[i] /= primes[k];
      if (isprimes[tarrn[i]]) {
        if (nremoved[tarrn[i]] > 0)
          --nremoved[tarrn[i]], div /= tarrn[i], tarrn[i] = 1;
        break;
      }
      if (tarrn[i] == 1) break;
    }
    if (i == 0)
      cout << div;
    else
      cout << " " << div;
  }
  cout << endl;
  for (int i = 0; i < (int)(m); ++i) {
    int div = tarrm[i];
    for (int k = 0; k < (int)(((long long)primes.size())); ++k) {
      while (mremoved[primes[k]] > 0 && tarrm[i] % primes[k] == 0)
        tarrm[i] /= primes[k], div /= primes[k], --mremoved[primes[k]];
      while (tarrm[i] % primes[k] == 0) tarrm[i] /= primes[k];
      if (isprimes[tarrm[i]]) {
        if (mremoved[tarrm[i]] > 0)
          --mremoved[tarrm[i]], div /= tarrm[i], tarrm[i] = 1;
        break;
      }
      if (tarrm[i] == 1) break;
    }
    if (i == 0)
      cout << div;
    else
      cout << " " << div;
  }
}
