#include <bits/stdc++.h>
using namespace std;
const int maxn = 20010;
struct Bitmap {
  unsigned bitmp[maxn >> 5];
  void updateToOne(const int& x) { bitmp[x >> 5] |= (unsigned)1 << (x & 31); }
  void updateToZero(const int& x) {
    bitmp[x >> 5] &= ~((unsigned)1 << (x & 31));
  }
  bool getBit(const int& x) {
    return bitmp[x >> 5] & ((unsigned)1 << (x & 31));
  }
} from[maxn >> 1];
int x[maxn], y[maxn];
long long sUp[maxn], sDown[maxn];
long long sFirst[maxn], sSecond[maxn];
char path[40020];
int main() {
  int n, m, p;
  scanf("%d%d%d", &n, &m, &p);
  for (int i = 0; i < n; ++i) scanf("%d", &x[i]);
  for (int i = 0; i < m; ++i) scanf("%d", &y[i]);
  long long scoreMax = -1;
  int midX = n / 2, midY = -1;
  sFirst[0] = (x[0] + y[0]) % p;
  for (int j = 1; j < m; ++j)
    sFirst[j] = sFirst[j - 1] + (x[0] + y[j]) % p, from[0].updateToZero(j);
  for (int i = 1; i <= midX; ++i) {
    for (int j = 0; j < m; ++j) {
      int sc = (x[i] + y[j]) % p;
      if (j && sSecond[j - 1] >= sFirst[j]) {
        sFirst[j] = sSecond[j] = sSecond[j - 1] + sc;
        from[i].updateToZero(j);
      } else {
        sFirst[j] = sSecond[j] = sFirst[j] + sc;
        from[i].updateToOne(j);
      }
    }
  }
  for (int i = 0; i < m; ++i) sUp[i] = sFirst[i];
  sFirst[m - 1] = (x[n - 1] + y[m - 1]) % p;
  for (int j = m - 2; ~j; --j)
    sFirst[j] = sFirst[j + 1] + (x[n - 1] + y[j]) % p;
  for (int i = n - 2; i >= midX; --i) {
    for (int j = m - 1; ~j; --j) {
      int sc = (x[i] + y[j]) % p;
      if (j < m - 1 && sSecond[j + 1] >= sFirst[j])
        sFirst[j] = sSecond[j] = sSecond[j + 1] + sc;
      else
        sFirst[j] = sSecond[j] = sFirst[j] + sc;
    }
  }
  for (int i = 0; i < m; ++i) sDown[i] = sFirst[i] - (x[midX] + y[i]) % p;
  for (int i = 0; i < m; ++i)
    if (sDown[i] + sUp[i] > scoreMax) scoreMax = sDown[i] + sUp[midY = i];
  cout << scoreMax << endl;
  int nowX = midX, nowY = midY, cnt = midX + midY;
  while (nowX || nowY) {
    bool flag = from[nowX].getBit(nowY);
    if (flag)
      --nowX, path[--cnt] = 'C';
    else
      --nowY, path[--cnt] = 'S';
  }
  sFirst[midY] = (x[midX] + y[midY]) % p;
  for (int j = midY; j < m; ++j)
    sFirst[j] = sFirst[j - 1] + (x[midX] + y[j]) % p, from[0].updateToZero(j);
  for (int i = midX + 1; i < n; ++i) {
    for (int j = midY; j < m; ++j) {
      int sc = (x[i] + y[j]) % p;
      if (j != midY && sSecond[j - 1] >= sFirst[j]) {
        sFirst[j] = sSecond[j] = sSecond[j - 1] + sc;
        from[i - midX].updateToZero(j);
      } else {
        sFirst[j] = sSecond[j] = sFirst[j] + sc;
        from[i - midX].updateToOne(j);
      }
    }
  }
  nowX = n - 1, nowY = m - 1, cnt = m + n - 2;
  while (nowX > midX || nowY > midY) {
    bool flag = from[nowX - midX].getBit(nowY);
    if (flag)
      --nowX, path[--cnt] = 'C';
    else
      --nowY, path[--cnt] = 'S';
  }
  cnt = m + n - 2;
  path[cnt++] = '\0';
  printf("%s\n", path);
  return 0;
}
