#include <bits/stdc++.h>
using namespace std;
long long int MOD = 1e9 + 7;
long long int power(long long int a, long long int n) {
  unsigned long long int result = 1, x = a;
  while (n > 0) {
    if (n % 2 == 1) result = (result * x) % MOD;
    x = (x * x) % MOD;
    n = n / 2;
  }
  return result;
}
long long int GCD(long long int a, long long int b) {
  if (b == 0)
    return a;
  else
    return GCD(b, a % b);
}
int SPF[10000001];
void prime() {
  for (int i = 2; i <= 10000000; i++) {
    if (SPF[i] == 0) {
      for (int j = i; j <= 10000000; j += i) {
        if (SPF[j] == 0) SPF[j] = i;
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int t;
  t = 1;
  while (t--) {
    prime();
    int n, m;
    cin >> n >> m;
    map<int, int> mp1, mp2;
    int a[n], b[m];
    for (int i = 0; i < n; i++) {
      int x;
      cin >> a[i];
      x = a[i];
      if (x == 1) continue;
      while (x != 1) {
        mp1[SPF[x]]++;
        x /= SPF[x];
      }
    }
    for (int i = 0; i < m; i++) {
      int x;
      cin >> b[i];
      x = b[i];
      if (x == 1) continue;
      while (x != 1) {
        mp2[SPF[x]]++;
        x /= SPF[x];
      }
    }
    for (auto i = mp1.begin(); i != mp1.end(); i++) {
      auto m2 = mp2.find(i->first);
      if (m2 != mp2.end()) {
        if (m2->second < i->second) {
          i->second -= m2->second;
          mp2[i->first] = 0;
        } else {
          mp2[i->first] -= i->second;
          i->second = 0;
        }
      }
    }
    vector<int> nume, deno;
    for (int i = 0; i < n; i++) {
      int x;
      x = a[i];
      long long int num = 1;
      while (x != 1) {
        if (mp1[SPF[x]]) {
          num *= SPF[x];
          mp1[SPF[x]]--;
        }
        x /= SPF[x];
      }
      if (num != 1) nume.push_back(num);
    }
    for (int i = 0; i < m; i++) {
      int x;
      x = b[i];
      long long int num = 1;
      while (x != 1) {
        if (mp2[SPF[x]]) {
          num *= SPF[x];
          mp2[SPF[x]]--;
        }
        x /= SPF[x];
      }
      if (num != 1) deno.push_back(num);
    }
    if (nume.size() == 0) nume.push_back(1);
    if (deno.size() == 0) deno.push_back(1);
    cout << nume.size() << " " << deno.size() << endl;
    for (int i = 0; i < nume.size(); i++) cout << nume[i] << " ";
    cout << endl;
    for (int i = 0; i < deno.size(); i++) cout << deno[i] << " ";
  }
  return 0;
}
