#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
const long long INFll = 1ll * INF * INF;
const long double ldINF = 1e+018;
const long double EPS = 0.000000001;
const int sdx[4] = {-1, 0, 1, 0};
const int sdy[4] = {0, 1, 0, -1};
template <typename T>
ostream& operator<<(ostream& out, pair<T, T>& a) {
  out << a.first << " " << a.second;
  return out;
}
template <typename T>
istream& operator>>(istream& in, pair<T, T>& a) {
  in >> a.first >> a.second;
  return in;
}
template <typename T>
istream& operator>>(istream& in, vector<T>& a) {
  for (int i = 0; i < a.size(); ++i) in >> a[i];
  return in;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> a) {
  for (int i = 0; i < a.size(); ++i)
    if (i == a.size() - 1)
      out << a[i];
    else
      out << a[i] << " ";
}
bool comp(pair<int, pair<int, int> > a, pair<int, pair<int, int> > b) {
  if (a.first != b.first) return a.first > b.first;
  if (a.second.first != b.second.first) return a.second.first < b.second.first;
  return a.second.second < b.second.second;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<pair<int, int> > a(n);
  vector<int> b(m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i].first);
    a[i].second = i;
  }
  for (int j = 0; j < m; j++) scanf("%d", &b[j]);
  vector<pair<int, pair<int, int> > > r;
  map<int, vector<pair<int, int> > > cnt;
  vector<bool> used(m, false);
  for (int i = 0; i < m; i++) {
    int x = b[i];
    int cur = 0;
    while (x > 1) {
      r.push_back(make_pair(x, make_pair(cur++, i)));
      int nxt = x / 2;
      if (x & 1) nxt++;
      x = nxt;
    }
    r.push_back(make_pair(1, make_pair(cur, i)));
  }
  sort(a.rbegin(), a.rend());
  sort(r.begin(), r.end(), comp);
  int cur = 0;
  int ans = 0, k = 0;
  vector<int> z(m, 0);
  vector<int> p(n, 0);
  for (int i = 0; i < n; i++) {
    while (cur < r.size() &&
           (used[r[cur].second.second] || a[i].first < r[cur].first))
      cur++;
    if (cur == r.size()) break;
    if (r[cur].first != a[i].first) continue;
    ans++;
    pair<int, int> val = r[cur].second;
    k += val.first;
    p[a[i].second] = val.second + 1;
    z[val.second] = val.first;
    used[val.second] = true;
  }
  printf("%d %d\n", ans, k);
  for (int i = 0; i < m; i++) printf("%d ", z[i]);
  printf("\n");
  for (int i = 0; i < n; i++) printf("%d ", p[i]);
  printf("\n");
  return 0;
}
