#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5, M = 1e7 + 7;
vector<long long int> spf(M);
map<long long, long long> tot;
vector<long long int> a(N, 1), b(N, 1);
vector<vector<long long> > ans(2, vector<long long int>());
void seive() {
  spf[0] = spf[1] = 1;
  for (long long int i = 0; i < M; i++) spf[i] = i;
  for (long long int i = 2; i < M; i++)
    if (spf[i] == i)
      for (long long j = i * i; j < M; j += i)
        if (spf[j] == j) spf[j] = i;
  return;
}
void fact(long long n, long long w, long long t) {
  map<long long, long long> pf;
  while (n > 1) {
    pf[spf[n]]++;
    if (t) tot[spf[n]] += w;
    n /= spf[n];
  }
  if (t) return;
  long long temp_ans = 1;
  for (auto it = (pf).begin(); it != (pf).end(); it++) {
    long long p = it->first;
    long long f = it->second;
    long long cnt = max((long long)0, min(tot[p] * w, f));
    temp_ans *= (long long)pow(p, cnt), tot[p] -= cnt * w;
  }
  if (!t) {
    if (w == 1)
      ans[0].push_back(temp_ans);
    else
      ans[1].push_back(temp_ans);
  }
  return;
}
int solve() {
  seive();
  long long n, m;
  cin >> n >> m;
  for (long long int i = 0; i < n; i++) cin >> a[i];
  for (long long int i = 0; i < m; i++) cin >> b[i];
  for (long long int i = 0; i < n; i++) fact(a[i], 1, 1);
  for (long long int i = 0; i < m; i++) fact(b[i], -1, 1);
  for (long long int i = 0; i < n; i++) fact(a[i], 1, 0);
  for (long long int i = 0; i < m; i++) fact(b[i], -1, 0);
  cout << (long long int)ans[0].size() << " " << (long long int)ans[1].size()
       << "\n";
  for (long long int i = 0; i < (long long int)ans[0].size(); i++)
    cout << ans[0][i] << " ";
  cout << "\n";
  for (long long int i = 0; i < (long long int)ans[1].size(); i++)
    cout << ans[1][i] << " ";
  cout << "\n";
  return 0;
}
int main() {
  auto start = chrono::high_resolution_clock::now();
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long test_cases = 1;
  while (test_cases--) solve();
  auto stop = chrono::high_resolution_clock::now();
  auto duration = chrono::duration_cast<chrono::milliseconds>(stop - start);
}
