#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
struct Node {
  int pos, id;
  Node(int p = 0, int i = 0) : pos(p), id(i) {}
  bool operator<(const Node& rhs) const { return pos < rhs.pos; }
} a[MAXN], b[MAXN];
int m, n;
long long c[3 * MAXN];
int ans[MAXN];
void add(int x, int y, int k) { c[x + n] += k, c[y + n] -= k; }
int main() {
  scanf("%d%d", &m, &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i].pos);
    a[i].pos--, a[i].id = i + 1;
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &b[i].pos);
    b[i].pos--, b[i].id = i + 1;
  }
  sort(a, a + n);
  sort(b, b + n);
  for (int i = 0; i < n; i++) {
    int j = lower_bound(b, b + n, a[i]) - b - i;
    int p = a[i].pos + (m + 1) / 2;
    if (p < m) {
      int k = lower_bound(b, b + n, Node(p)) - b - i;
      add(j, k, -a[i].pos);
      add(k, n - i, a[i].pos + m);
      add(n - i, j + n, a[i].pos);
    } else {
      int k = lower_bound(b, b + n, Node(p - m)) - b - i;
      add(j, n - i, -a[i].pos);
      add(n - i, k + n, m - a[i].pos);
      add(k + n, j + n, a[i].pos);
    }
  }
  for (int i = 0; i < n; i++) {
    int j = i - (upper_bound(a, a + n, b[i]) - a - 1);
    int p = b[i].pos - (m + 1) / 2;
    if (p >= 0) {
      int k = i - (upper_bound(a, a + n, Node(p)) - a - 1);
      add(j, k, b[i].pos);
      add(k, j + n, -b[i].pos);
    } else {
      int k = i - (upper_bound(a, a + n, Node(p + m)) - a - 1);
      add(j, k + n, b[i].pos);
      add(k + n, j + n, -b[i].pos);
    }
  }
  for (int i = 1; i < 3 * n; i++) c[i] += c[i - 1];
  for (int i = 0; i < n; i++) c[i] += c[i + n] + c[i + 2 * n];
  int p = min_element(c, c + n) - c;
  printf("%lld\n", c[p]);
  for (int i = 0; i < n; i++) ans[a[i].id] = b[(i + p) % n].id;
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  putchar('\n');
  return 0;
}
