#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
template <class T>
T SQR(const T &a) {
  return a * a;
}
const int SZ = 1e7 + 1;
int pr[1000000];
int st[SZ] = {0};
int prCnt = 0;
int del[SZ] = {0};
void run() {
  for (int i = (2), ei = (SZ); i < ei; i++) {
    if (del[i] == 0) {
      del[i] = i;
      pr[prCnt++] = i;
    }
    for (int j = 0; j < prCnt && pr[j] <= del[i] && i * pr[j] < SZ; j++)
      del[i * pr[j]] = pr[j];
  }
  int n, m;
  cin >> n >> m;
  int A[100100];
  int B[100100];
  for (int i = (0), ei = (n); i < ei; i++) {
    int a;
    scanf("%d", &a);
    A[i] = a;
    while (a != 1) {
      st[del[a]]++;
      a /= del[a];
    }
  }
  for (int i = (0), ei = (m); i < ei; i++) {
    int b;
    scanf("%d", &b);
    B[i] = b;
    while (b != 1) {
      st[del[b]]--;
      b /= del[b];
    }
  }
  vector<int> nom;
  vector<int> denom;
  for (int i = (0), ei = (n); i < ei; i++) {
    int a = A[i];
    int curr = 1;
    while (a != 1) {
      if (st[del[a]] > 0) {
        curr *= del[a];
        --st[del[a]];
      }
      a /= del[a];
    }
    nom.push_back(curr);
  }
  for (int i = (0), ei = (m); i < ei; i++) {
    int b = B[i];
    int curr = 1;
    while (b != 1) {
      if (st[del[b]] < 0) {
        curr *= del[b];
        ++st[del[b]];
      }
      b /= del[b];
    }
    denom.push_back(curr);
  }
  printf("%d %d\n", nom.size(), denom.size());
  for (int i = (0), ei = (nom.size()); i < ei; i++) printf("%d ", nom[i]);
  puts("");
  for (int i = (0), ei = (denom.size()); i < ei; i++) printf("%d ", denom[i]);
  puts("");
}
int main() {
  run();
  return 0;
}
