#include <bits/stdc++.h>
using namespace std;
int dp[4008][4008], from[4008][4008];
int pres[4008], pren[4008];
int pre[4008], nxt[4008];
int n;
int val[4008];
vector<int> pos;
int modi(int x) {
  if (x < 0) x += n;
  if (x >= n) x -= n;
  assert(x >= 0);
  return x;
}
int tryupd(int st, int ep) {
  if (pos.size() == 1 or (pos.size() == 2 and (pos[0] == st or pos[1] == st))) {
    if (st == ep and pos.size() == 2) return 1e9;
    return min(modi(st - ep), modi(ep - st));
  }
  int e = modi(pre[ep + n]), f = modi(nxt[ep]);
  if (ep == modi(pre[n + st])) {
    return min(modi(ep - st), 2 * modi(e - st) + modi(st - ep));
  }
  if (ep == modi(nxt[st])) {
    return min(modi(st - ep), 2 * modi(st - f) + modi(ep - st));
  }
  return min(2 * modi(e - st) + modi(st - ep),
             2 * modi(st - f) + modi(ep - st));
}
int used[4008];
int emp;
vector<int> ps[4008];
int fucki;
void output(int x) {
  if (x < 0)
    printf("-%d\n", -x);
  else
    printf("+%d\n", x);
}
void print(int x) { ps[fucki].push_back(x); }
void gogogo(int x, int y, int d) {
  int step = 0;
  if (!used[x] and val[x] == emp) used[x] = 1, print(0);
  for (; x != y;) {
    x += d;
    step += d;
    x = modi(x);
    if (!used[x] and val[x] == emp) used[x] = 1, print(step), step = 0;
  }
}
void upd(int st, int ep) {
  if (pos.size() == 1 or (pos.size() == 2 and (pos[0] == st or pos[1] == st))) {
    if (modi(st - ep) < modi(ep - st))
      gogogo(st, ep, -1);
    else
      gogogo(st, ep, 1);
  }
  int e = modi(pre[ep + n]), f = modi(nxt[ep]);
  if (ep == modi(pre[n + st])) {
    if (modi(ep - st) < 2 * modi(e - st) + modi(st - ep))
      gogogo(st, ep, 1);
    else
      gogogo(st, e, 1), gogogo(e, ep, -1);
  }
  if (ep == modi(nxt[st])) {
    if (modi(st - ep) < 2 * modi(st - f) + modi(ep - st))
      gogogo(st, ep, -1);
    else
      gogogo(st, f, -1), gogogo(f, ep, 1);
  }
  if (2 * modi(e - st) + modi(st - ep) < 2 * modi(st - f) + modi(ep - st))
    gogogo(st, e, 1), gogogo(e, ep, -1);
  else
    gogogo(st, f, -1), gogogo(f, ep, 1);
}
int main() {
  int s;
  scanf("%d%d", &n, &s);
  s--;
  vector<int> all;
  all.push_back(-1000000007);
  for (int i = 0; i < n; i++) {
    scanf("%d", &val[i]);
    all.push_back(val[i]);
    val[i + n] = val[i];
  }
  sort(all.begin(), all.end());
  all.resize(unique(all.begin(), all.end()) - all.begin());
  memset(dp, 0x3f, sizeof dp);
  dp[0][s] = 0;
  int m = all.size();
  for (int ki = 1; ki < m; ki++) {
    int cmp = all[ki];
    int lst = -1;
    pos.clear();
    for (int i = 0; i < n; i++)
      if (val[i] == cmp) pos.push_back(i);
    for (int i = 0; i < n + n; i++) {
      pre[i] = lst;
      if (val[i] == cmp) lst = i;
    }
    lst = -1;
    for (int i = n + n - 1; i >= 0; i--) {
      nxt[i] = lst;
      if (val[i] == cmp) lst = i;
    }
    for (int i = 0; i < n; i++)
      for (int j = 0; j < pos.size(); j++)
        if (dp[ki - 1][i] < 1e9) {
          if (tryupd(i, pos[j]) + dp[ki - 1][i] < dp[ki][pos[j]]) {
            dp[ki][pos[j]] = tryupd(i, pos[j]) + dp[ki - 1][i];
            from[ki][pos[j]] = i;
          }
        }
  }
  int ans = 1e9;
  int wh = 0;
  for (int i = 0; i < n; i++) {
    if (dp[m - 1][i] < ans) wh = i;
    ans = min(ans, dp[m - 1][i]);
  }
  printf("%d\n", ans);
  for (int ki = m - 1; ki >= 1; ki--) {
    fucki = ki;
    int cmp = all[ki];
    emp = cmp;
    int lst = -1;
    pos.clear();
    for (int i = 0; i < n; i++)
      if (val[i] == cmp) pos.push_back(i);
    for (int i = 0; i < n + n; i++) {
      pre[i] = lst;
      if (val[i] == cmp) lst = i;
    }
    lst = -1;
    for (int i = n + n - 1; i >= 0; i--) {
      nxt[i] = lst;
      if (val[i] == cmp) lst = i;
    }
    int h = from[ki][wh];
    upd(h, wh);
    wh = h;
  }
  for (int i = 1; i <= m - 1; i++) {
    for (int j = 0; j < ps[i].size(); ++j) output(ps[i][j]);
  }
  return 0;
}
