#include <bits/stdc++.h>
using namespace std;
int calculaVoltaje(int volt, int divisores) {
  while (divisores--) {
    volt = (volt + 1) >> 1;
  }
  return volt;
}
vector<int> PcLibres[200005];
int main() {
  int n, m, v;
  scanf("%d%d", &n, &m);
  vector<int> voltajeSocket;
  vector<bool> socketUsado(m, false);
  vector<int> divisoresEnSocket(m, 0);
  vector<int> conectadoA(n, -1);
  map<int, int> llavePc;
  int maxLlave = 0;
  for (int i = 0; i < n; i++) {
    scanf("%d", &v);
    if (llavePc.find(v) == llavePc.end()) {
      llavePc[v] = maxLlave;
      PcLibres[maxLlave].push_back(i);
      maxLlave++;
    } else {
      int llave = llavePc[v];
      PcLibres[llave].push_back(i);
    }
  }
  for (int i = 0; i < m; i++) {
    scanf("%d", &v);
    voltajeSocket.push_back(v);
  }
  int conectadas = 0, adaptadores = 0;
  for (int i = 0; i < 32; i++) {
    for (int j = 0; j < m; j++) {
      if (!socketUsado[j]) {
        int voltaje = calculaVoltaje(voltajeSocket[j], i);
        if (llavePc.find(voltaje) != llavePc.end()) {
          int llave = llavePc[voltaje];
          if (PcLibres[llave].size() > 0) {
            int pc = PcLibres[llave][PcLibres[llave].size() - 1];
            divisoresEnSocket[j] = i;
            adaptadores += i;
            conectadas++;
            conectadoA[pc] = j;
            PcLibres[llave].pop_back();
            socketUsado[j] = true;
          }
        }
      }
    }
  }
  printf("%d %d\n", conectadas, adaptadores);
  printf("%d", divisoresEnSocket[0]);
  for (int i = 1; i < m; i++) printf(" %d", divisoresEnSocket[i]);
  printf("\n");
  printf("%d", conectadoA[0] + 1);
  for (int i = 1; i < n; i++) printf(" %d", conectadoA[i] + 1);
  printf("\n");
  return 0;
}
