#include <bits/stdc++.h>
using namespace std;
vector<int> a, b, ans1, ans2, pr, lp;
map<int, vector<int> > c, z;
long long const M = 10000000;
void resheto() {
  for (int i = 2; i <= M; i++) {
    if (lp[i] == 0) {
      lp[i] = i;
      pr.push_back(i);
    }
    int j = 0;
    while (j < pr.size() && pr[j] <= lp[i] && i * pr[j] <= M) {
      lp[i * pr[j]] = pr[j];
      j++;
    }
  }
}
void razbor(int x, int pos) {
  int d = lp[x];
  while (x > 1 && x % d == 0) {
    c[d].push_back(pos);
    x = x / d;
    d = lp[x];
  }
}
void razbor1(int x, int pos) {
  int d = lp[x];
  while (x > 1 && x % d == 0) {
    z[d].push_back(pos);
    x = x / d;
    d = lp[x];
  }
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int n, m;
  scanf("%d%d", &n, &m);
  a.resize(n);
  b.resize(m);
  lp.resize(M);
  resheto();
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int j = 0; j < m; j++) scanf("%d", &b[j]);
  for (int i = 0; i < n; i++) razbor(a[i], i);
  for (int i = 0; i < m; i++) razbor1(b[i], i);
  for (auto i = c.begin(); i != c.end(); i++) {
    int p = i->first;
    int h = min(c[p].size(), z[p].size());
    int j1 = c[p].size() - 1, j2 = z[p].size() - 1;
    while (h > 0) {
      a[c[p][j1]] /= p;
      b[z[p][j2]] /= p;
      j1--;
      j2--;
      h--;
      c[p].resize(c[p].size() - 1);
      z[p].resize(z[p].size() - 1);
    }
  }
  cout << n << " " << m << endl;
  for (int i = 0; i < n; i++) cout << a[i] << " ";
  cout << endl;
  for (int i = 0; i < m; i++) cout << b[i] << " ";
  return 0;
}
