#include <bits/stdc++.h>
using namespace std;
const int N1 = 1e7 + 100;
const int N2 = 1e6 + 100;
const int N3 = 1e5 + 100;
int p[N1], pri[N2], pn;
void init() {
  int n = 1e7;
  memset(p, 0, sizeof(p));
  pn = 0;
  for (int i = 2; i <= n; i++) {
    if (!p[i]) {
      pri[pn++] = i;
    }
    for (int j = 0; j < pn; j++) {
      if (i > n / pri[j]) break;
      p[i * pri[j]] = 1;
      if (i % pri[j] == 0) break;
    }
  }
}
int aa[N2], bb[N2];
int cc[N3], dd[N3];
struct Node {
  int v, num, next;
} node[N2 * 2];
int head[N3 * 2], total;
void adde(int u, int v, int num) {
  node[total].v = v;
  node[total].num = num;
  node[total].next = head[u];
  head[u] = total++;
}
int f(int a, int v) {
  int ans = 1;
  while (v) {
    if (v & 1) {
      ans *= a;
    }
    v /= 2;
    a *= a;
  }
  return ans;
}
int main() {
  int n, m;
  init();
  while (scanf("%d%d", &n, &m) != EOF) {
    memset(aa, 0, sizeof(aa));
    memset(bb, 0, sizeof(bb));
    memset(head, -1, sizeof(head));
    total = 0;
    for (int i = 0; i < n; i++) {
      int a;
      scanf("%d", &a);
      cc[i] = a;
      for (int j = 0; j < pn && pri[j] <= a / pri[j]; j++) {
        if (a % pri[j] == 0) {
          int cnt = 0;
          while (a % pri[j] == 0) {
            cnt++;
            a /= pri[j];
            aa[j]++;
          }
          adde(i, j, cnt);
        }
      }
      if (a != 1) {
        int id = lower_bound(pri, pri + pn, a) - pri;
        adde(i, id, 1);
        aa[id]++;
      }
    }
    for (int i = 0; i < m; i++) {
      int a;
      scanf("%d", &a);
      dd[i] = a;
      for (int j = 0; j < pn && pri[j] <= a / pri[j]; j++) {
        if (a % pri[j] == 0) {
          int cnt = 0;
          while (a % pri[j] == 0) {
            bb[j]++;
            a /= pri[j];
            cnt++;
          }
          adde(i + n, j, cnt);
        }
      }
      if (a != 1) {
        int id = lower_bound(pri, pri + pn, a) - pri;
        bb[id]++;
        adde(i + n, id, 1);
      }
    }
    for (int i = 0; i < pn; i++) {
      aa[i] -= bb[i];
    }
    printf("%d %d\n", n, m);
    for (int i = 0; i < n; i++) {
      for (int j = head[i]; j != -1; j = node[j].next) {
        int v = node[j].v, num = node[j].num;
        if (aa[v] < 0)
          cc[i] /= f(pri[v], num);
        else if (aa[v] <= num) {
          cc[i] /= f(pri[v], num - aa[v]);
          aa[v] = 0;
        } else
          aa[v] -= num;
      }
      printf("%d", cc[i]);
      if (i != n - 1)
        printf(" ");
      else
        printf("\n");
    }
    for (int i = 0; i < m; i++) {
      for (int j = head[i + n]; j != -1; j = node[j].next) {
        int v = node[j].v, num = node[j].num;
        if (-aa[v] < 0)
          dd[i] /= f(pri[v], num);
        else if (-aa[v] <= num) {
          dd[i] /= f(pri[v], num + aa[v]);
          aa[v] = 0;
        } else
          aa[v] += num;
      }
      printf("%d", dd[i]);
      if (i != m - 1)
        printf(" ");
      else
        printf("\n");
    }
  }
  return 0;
}
