#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int ans[N], sockt[N];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  set<pair<int, int> > p;
  set<pair<int, pair<int, int> > > s;
  int x;
  for (int i = 0; i < n; i++) {
    scanf("%d", &x);
    p.insert({x, i});
  }
  for (int i = 0; i < m; i++) {
    scanf("%d", &x);
    s.insert({x, {0, i}});
  }
  set<pair<int, int> >::iterator it;
  set<pair<int, pair<int, int> > >::iterator et;
  pair<int, pair<int, int> > tmp;
  int c = 0, u = 0;
  while (s.size() && p.size()) {
    et = s.end();
    et--;
    tmp = (*et);
    s.erase(et);
    x = tmp.first;
    it = p.end();
    it--;
    if (tmp.first == (*it).first) {
      c++;
      ans[(*it).second] = tmp.second.second + 1;
      sockt[tmp.second.second] = tmp.second.first * -1;
      u += tmp.second.first * -1;
      p.erase(it);
      continue;
    } else if (tmp.first > (*it).first) {
      tmp.second.first--;
      tmp.first = ((tmp.first + 1) / 2);
      s.insert(tmp);
    } else {
      s.insert(tmp);
      p.erase(it);
    }
  }
  printf("%d %d\n", c, u);
  for (int i = 0; i < m; i++) printf("%d ", sockt[i]);
  printf("\n");
  for (int i = 0; i < n; i++) printf("%d ", ans[i]);
  printf("\n");
  return 0;
}
