#include <bits/stdc++.h>
using namespace std;
char primes[10000005] = {};
int useda[10000005] = {};
int usedb[10000005] = {};
int cut[10000005] = {};
vector<int> g;
void init() {
  memset(primes, 1, sizeof(primes));
  primes[0] = primes[1] = 0;
  for (int i = 2; i < 10000005; i++) {
    if (primes[i] == 0) continue;
    g.push_back(i);
    for (int j = i * 2; j < 10000005; j += i) {
      primes[j] = 0;
    }
  }
}
int main() {
  init();
  int n, m;
  cin >> n >> m;
  vector<vector<int> > A(n), B(m);
  vector<int> ga(n), gb(m);
  for (int i = 0; i < n; i++) {
    int a;
    scanf("%d", &a);
    ga[i] = a;
    for (int j = 0; j < g.size(); j++) {
      if (primes[a]) {
        useda[a]++;
        A[i].push_back(a);
        break;
      }
      if (a < g[j] * g[j]) break;
      while (a % g[j] == 0) {
        useda[g[j]]++;
        A[i].push_back(g[j]);
        a /= g[j];
      }
    }
  }
  for (int i = 0; i < m; i++) {
    int b;
    scanf("%d", &b);
    gb[i] = b;
    for (int j = 0; j < g.size(); j++) {
      if (primes[b]) {
        usedb[b]++;
        B[i].push_back(b);
        break;
      }
      if (b < g[j] * g[j]) break;
      while (b % g[j] == 0) {
        usedb[g[j]]++;
        B[i].push_back(g[j]);
        b /= g[j];
      }
    }
  }
  cout << n << " " << m << endl;
  for (int i = 0; i < g.size(); i++) cut[g[i]] = min(useda[g[i]], usedb[g[i]]);
  for (int i = 0; i < n; i++) {
    if (i) printf(" ");
    int a = ga[i];
    for (int j = 0; j < A[i].size(); j++) {
      if (cut[A[i][j]]) {
        cut[A[i][j]]--;
        a /= A[i][j];
      }
    }
    printf("%d", a);
  }
  cout << endl;
  for (int i = 0; i < g.size(); i++) cut[g[i]] = min(useda[g[i]], usedb[g[i]]);
  for (int i = 0; i < m; i++) {
    if (i) printf(" ");
    int b = gb[i];
    for (int j = 0; j < B[i].size(); j++) {
      if (cut[B[i][j]]) {
        cut[B[i][j]]--;
        b /= B[i][j];
      }
    }
    printf("%d", b);
  }
  cout << endl;
  return 0;
}
