#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void Int(T &n) {
  n = 0;
  int f = 1;
  register int ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) n = (n << 3) + (n << 1) + ch - '0';
  n = n * f;
}
template <typename T>
T gcd(T a, T b) {
  return !b ? a : gcd(b, a % b);
}
template <typename T>
inline void umin(T &a, T b) {
  a = a < b ? a : b;
}
template <typename T>
inline void umax(T &a, T b) {
  a = a > b ? a : b;
}
template <typename T, typename W>
inline void Int(T &x, W &y) {
  Int(x), Int(y);
}
template <typename T, typename W, typename Q>
inline void Int(T &x, W &y, Q &z) {
  Int(x, y), Int(z);
}
const int N = 1e7 + 7;
const int inf = 1e9 + 7;
inline bool isp(int n) {
  int r = sqrt(1.0 * n);
  for (int i = 2; i <= r; i++) {
    if (n % i == 0) return false;
  }
  return true;
}
int acnt[N], bcnt[N], ccnt[N];
vector<int> A[100005], B[100005];
int solve() {
  vector<int> primes;
  for (int i = 2; i <= 3200; ++i)
    if (isp(i)) {
      primes.push_back(i);
    }
  int n, m;
  Int(n, m);
  for (int i = 1; i <= n; ++i) {
    int x;
    Int(x);
    for (int p : primes) {
      while (x % p == 0) {
        ++acnt[p], x /= p;
        A[i].push_back(p);
      }
    }
    if (x > 1) ++acnt[x], A[i].push_back(x);
  }
  for (int i = 1; i <= m; ++i) {
    int x;
    Int(x);
    for (int p : primes) {
      while (x % p == 0) {
        ++bcnt[p], x /= p;
        B[i].push_back(p);
      }
    }
    if (x > 1) ++bcnt[x], B[i].push_back(x);
  }
  for (int i = 1; i <= 10000000; ++i) {
    ccnt[i] = min(acnt[i], bcnt[i]);
    acnt[i] = bcnt[i] = 0;
  }
  vector<int> num, den;
  for (int i = 1; i <= n; ++i) {
    int x = 1;
    for (int val : A[i]) {
      ++acnt[val];
      if (acnt[val] > ccnt[val]) x *= val;
    }
    num.push_back(x);
  }
  for (int i = 1; i <= m; ++i) {
    int x = 1;
    for (int val : B[i]) {
      ++bcnt[val];
      if (bcnt[val] > ccnt[val]) x *= val;
    }
    den.push_back(x);
  }
  printf("%d %d\n", (int)num.size(), (int)den.size());
  for (int i = 0; i <= (int)num.size() - 1; ++i) printf("%d ", num[i]);
  printf("\n");
  for (int i = 0; i <= (int)den.size() - 1; ++i) printf("%d ", den[i]);
  printf("\n");
  return 0;
}
int main() {
  int tests = 1, CaseNo = 0;
  while (tests--) {
    solve();
  }
  return 0;
}
