#include <bits/stdc++.h>
using namespace std;
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int times[10000015];
int dtimes[10000015];
int Tnums[100012];
int Bnums[100012];
vector<int> primes;
void get_inp(int Knums[], int r, int timel[]) {
  for (int i = 0; i < r; i++) {
    int a;
    cin >> a;
    Knums[i] = a;
    for (int j = 0; j < primes.size(); j++) {
      while (a % primes[j] == 0) {
        timel[primes[j]]++;
        a /= primes[j];
      }
    }
    if (a > 1) timel[a]++;
  }
}
void reduce_frac(int z, int timel[], int Xnums[]) {
  for (int i = 0; i < z; i++) {
    int val;
    val = Xnums[i];
    for (int j = 0; j < primes.size(); j++) {
      while (Xnums[i] % primes[j] == 0 && timel[primes[j]] > 0) {
        Xnums[i] /= primes[j];
        val /= primes[j];
        timel[primes[j]]--;
      }
      while (Xnums[i] % primes[j] == 0) Xnums[i] /= primes[j];
    }
    if (Xnums[i] > 1 && timel[Xnums[i]] > 0) {
      timel[Xnums[i]]--;
      Xnums[i] = val / Xnums[i];
    } else
      Xnums[i] = val;
  }
}
void print_ans(int Knums[], int k) {
  bool one_printed = false;
  int ones_to_print = 0;
  for (int i = 0; i < k; i++) {
    if (Knums[i] == 1) {
      if (one_printed) {
        ones_to_print++;
        continue;
      }
      one_printed = true;
    }
    cout << Knums[i] << " ";
  }
  for (int i = 0; i < ones_to_print; i++) {
    cout << 1 << " ";
  }
  cout << endl;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  primes.push_back(2);
  for (int i = 3; i <= 3162; i += 2) {
    bool valid = true;
    for (int j = 3; j * j <= i; j += 2) {
      if (i % j == 0) {
        valid = false;
        break;
      }
    }
    if (valid) primes.push_back(i);
  }
  get_inp(Tnums, n, times);
  get_inp(Bnums, m, dtimes);
  reduce_frac(n, dtimes, Tnums);
  reduce_frac(m, times, Bnums);
  cout << n << " " << m << endl;
  print_ans(Tnums, n);
  print_ans(Bnums, m);
  return 0;
}
