#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
vector<int> prime;
bool canbe[10000007];
void precalc() {
  for (int i = 2; i <= 10000000; ++i) {
    if (!canbe[i]) {
      prime.push_back(i);
      for (int j = 2; j * i <= 10000000; ++j) canbe[j * i] = true;
    }
  }
}
class DSU {
 private:
  vector<int> parent, rank;

 public:
  DSU(int n) {
    parent.assign(n, 0);
    rank.assign(n, 0);
    for (int i = 0; i < n; ++i) {
      make_set(i);
    }
  }
  void make_set(int v) {
    parent[v] = v;
    rank[v] = 0;
  }
  int find_set(int v) {
    if (v == parent[v]) return v;
    return parent[v] = find_set(parent[v]);
  }
  void union_sets(int a, int b) {
    a = find_set(a);
    b = find_set(b);
    if (a != b) {
      if (rank[a] < rank[b]) swap(a, b);
      parent[b] = a;
      if (rank[a] == rank[b]) ++rank[a];
    }
  }
};
int fans[10000007];
int divs[100005], dels[100005];
int main() {
  ios::sync_with_stdio(false);
  int n, m, temp, pSize;
  cin >> n >> m;
  precalc();
  pSize = prime.size();
  for (int i = 0; i < n; ++i) {
    cin >> temp;
    divs[i] = temp;
    for (int j = 0; j < pSize && prime[j] * prime[j] <= temp; ++j) {
      while (temp % prime[j] == 0) {
        ++fans[prime[j]];
        temp /= prime[j];
      }
    }
    if (temp != 1) ++fans[temp];
  }
  for (int i = 0; i < m; ++i) {
    cin >> temp;
    dels[i] = temp;
    for (int j = 0; j < pSize && prime[j] * prime[j] <= temp; ++j) {
      while (temp % prime[j] == 0) {
        --fans[prime[j]];
        temp /= prime[j];
      }
    }
    if (temp != 1) --fans[temp];
  }
  vector<int> ans1(n, 1), ans2(m, 1);
  int temp2;
  for (int i = 0; i < n; ++i) {
    temp = divs[i];
    temp2 = 1;
    for (int j = 0; j < pSize && prime[j] * prime[j] <= temp; ++j) {
      while (temp % prime[j] == 0) {
        if (fans[prime[j]] > 0) {
          temp2 *= prime[j];
          --fans[prime[j]];
        }
        temp /= prime[j];
      }
    }
    if (temp != 1) {
      if (fans[temp] > 0) {
        temp2 *= temp;
        --fans[temp];
      }
    }
    ans1[i] = temp2;
  }
  for (int i = 0; i < m; ++i) {
    temp = dels[i];
    temp2 = 1;
    for (int j = 0; j < pSize && prime[j] * prime[j] <= temp; ++j) {
      while (temp % prime[j] == 0) {
        if (fans[prime[j]] < 0) {
          temp2 *= prime[j];
          ++fans[prime[j]];
        }
        temp /= prime[j];
      }
    }
    if (temp != 1) {
      if (fans[temp] < 0) {
        temp2 *= temp;
        ++fans[temp];
      }
    }
    ans2[i] = temp2;
  }
  cout << ans1.size() << ' ' << ans2.size() << endl;
  for (int i = 0; i < ans1.size(); ++i) cout << ans1[i] << ' ';
  cout << endl;
  for (int i = 0; i < ans2.size(); ++i) cout << ans2[i] << ' ';
  return 0;
}
