#include <bits/stdc++.h>
using namespace std;
long long sqr(long long x) { return x * x; }
int mysqrt(long long x) {
  int l = 0, r = 1e9 + 1;
  while (r - l > 1) {
    int m = (l + r) / 2;
    if (m * (long long)m <= x)
      l = m;
    else
      r = m;
  }
  return l;
}
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
mt19937_64 rndll(
    chrono::high_resolution_clock::now().time_since_epoch().count());
long long AR = 19, BR = 13, CR = 23, XR = 228, YR = 322, MODR = 1e9 + 993;
long long myrand() {
  long long ZR = (XR * AR + YR * BR + CR) % MODR;
  XR = YR;
  YR = ZR;
  return ZR;
}
int gcd(int a, int b) { return a ? gcd(b % a, a) : b; }
int gcdex(int a, int b, int &x, int &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  int x1, y1;
  int ret = gcdex(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return ret;
}
int Mod = 1e9 + 993;
int Bpow(int x, long long y) {
  int ret = 1;
  int w = x;
  while (y) {
    if (y & 1) ret = (ret * (long long)w) % Mod;
    w = (w * (long long)w) % Mod;
    y >>= 1;
  }
  return ret;
}
int Bdiv(int x) {
  int a, b;
  gcdex(x, Mod, a, b);
  if (a < 0) a += Mod;
  return a;
}
int Bdiv(int x, int y) { return (x * (long long)Bpow(y, Mod - 2)) % Mod; }
inline int ad(int x, int y) { return x + y >= Mod ? x + y - Mod : x + y; }
inline int dif(int x, int y) { return x - y < 0 ? x - y + Mod : x - y; }
inline int mul(int x, int y) { return (x * (long long)y) % Mod; }
int inv(int a) {
  int b = Mod, x = 0, y = 1;
  while (a) {
    int t = b / a;
    b -= a * t;
    x -= t * y;
    swap(a, b);
    swap(x, y);
  }
  if (x < 0) x += Mod;
  return x;
}
void setmin(int &x, int y) { x = min(x, y); }
void setmax(int &x, int y) { x = max(x, y); }
void setmin(long long &x, long long y) { x = min(x, y); }
void setmax(long long &x, long long y) { x = max(x, y); }
const long long llinf = 1e18 + 100;
const long double eps = 1e-9;
const int maxn = 2e5 + 100, maxw = 1e6 + 100, inf = 1e9 + 100, sq = 100, X = 43,
          LG = 17;
int a[2 * maxn], b[2 * maxn], M, n, c[2 * maxn];
int ia[2 * maxn], ib[2 * maxn];
long long answer = llinf;
int tanswer;
int danswer;
int pans[maxn];
long long arr[maxn][2];
long long calc(int ds, int tup, bool pr = 0) {
  if (!pr) {
    if (arr[ds][tup] == -1) {
      long long ans = 0;
      for (int i = 0; i < n; i++) ans += abs(a[ds + i] - b[i]);
      if (answer > ans) {
        answer = ans;
        tanswer = tup;
        danswer = ds;
      }
      arr[ds][tup] = ans;
    }
    return arr[ds][tup];
  } else {
    if (!tup) {
      for (int i = 0; i < n; i++) pans[ia[ds + i]] = ib[i];
    } else {
      swap(ia, ib);
      for (int i = 0; i < n; i++) pans[ib[i]] = ia[ds + i];
    }
    return 0;
  }
}
void solve(int tup) {
  int l = 0, r = n;
  calc(l, tup);
  calc(r, tup);
  while (r - l > 1) {
    int m = (l + r) / 2;
    if (calc(m, tup) < calc(m - 1, tup))
      l = m;
    else
      r = m;
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> M >> n;
  for (int i = 0; i <= n; i++)
    for (int j = 0; j < 2; j++) arr[i][j] = -1;
  for (int i = 0; i < n; i++) cin >> a[i], ia[i] = i;
  sort(ia, ia + n, [&](int x, int y) { return a[x] < a[y]; });
  for (int i = 0; i < n; i++) c[i] = a[ia[i]];
  swap(a, c);
  for (int i = 0; i < n; i++) a[i + n] = M + a[i], ia[i + n] = ia[i];
  for (int i = 0; i < n; i++) cin >> b[i], ib[i] = i;
  sort(ib, ib + n, [&](int x, int y) { return b[x] < b[y]; });
  for (int i = 0; i < n; i++) c[i] = b[ib[i]];
  swap(b, c);
  for (int i = 0; i < n; i++) b[i + n] = M + b[i], ib[i + n] = ib[i];
  swap(a, b);
  swap(ia, ib);
  solve(1);
  swap(a, b);
  swap(ia, ib);
  solve(0);
  calc(danswer, tanswer, 1);
  cout << answer << '\n';
  for (int i = 0; i < n; i++) cout << pans[i] + 1 << ' ';
  cout << '\n';
}
