#include <bits/stdc++.h>
using namespace std;
inline bool SR(int &x) { return scanf("%d", &x) == 1; }
inline bool SR(long long &x) { return scanf("%lld", &x) == 1; }
inline bool SR(double &x) { return scanf("%lf", &x); }
inline bool SR(char *s) { return scanf("%s", s); }
inline bool RI() { return 1; }
template <typename I, typename... T>
bool RI(I &x, T &...tail) {
  return SR(x) && RI(tail...);
}
inline void SP(const int x) { printf("%d", x); }
inline void SP(const long long x) { printf("%lld", x); }
inline void SP(const double x) { printf("%.10f", x); }
inline void SP(const char *s) { printf("%s", s); }
inline void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I x, const T... tail) {
  SP(x);
  if (sizeof...(tail)) putchar(' ');
  PL(tail...);
}
template <typename I>
inline void _DOING(const char *s, I &&x) {
  cerr << s << " = " << x << '\n';
}
template <typename I, typename... T>
void _DOING(const char *s, I &&x, T &&...tail) {
  int c = 0;
  while (*s != ',' || c != 0) {
    if (*s == '(' || *s == '[' || *s == '{') c++;
    if (*s == ')' || *s == ']' || *s == '}') c--;
    cerr << *s++;
  }
  cerr << " = " << x << " , ";
  _DOING(s + 1, tail...);
}
const int INF = 0x3f3f3f3f;
const long long INF64 = 0x3f3f3f3f3f3f3f3fll;
inline int RAND() {
  static int x = 880301;
  return x = (x * 0xdefacedll + 1ll) % 0x7fffffffll;
}
const int MAX_N = 20000 + 7;
int X[MAX_N];
int Y[MAX_N];
int N, M, P;
long long dp1[2][MAX_N];
long long dp2[2][MAX_N];
vector<pair<int, int> > rd;
void dq(int sx, int sy, int tx, int ty, long long ans) {
  if (sx == tx) {
    for (int i = (sy); i <= int(ty); i++) rd.push_back(make_pair(sx, i));
    return;
  }
  for (int i = (sy); i <= int(ty + 1); i++) {
    dp2[0][i] = 0;
    dp2[1][i] = 0;
  }
  int mid = (sx + tx) >> 1;
  for (int i = (tx); i >= int(mid); i--) {
    for (int j = (sy); j <= int(ty + 1); j++) dp2[i & 1][j] = 0;
    for (int j = (ty); j >= int(sy); j--) {
      int v = X[i] + Y[j];
      if (v >= P) v -= P;
      dp2[i & 1][j] = max(dp2[i & 1][j + 1], dp2[~i & 1][j]) + v;
    }
  }
  if (sx + 1 == tx) {
    while (sx != tx) {
      int v = X[sx] + Y[sy];
      if (v >= P) v -= P;
      rd.push_back(make_pair(sx, sy));
      if (dp2[sx & 1][sy] == dp2[tx & 1][sy] + v)
        sx = tx;
      else
        sy++;
    }
    for (int i = (sy); i <= int(ty); i++) rd.push_back(make_pair(tx, i));
    return;
  }
  for (int i = (sy - 1); i <= int(ty); i++) {
    dp1[0][i] = 0;
    dp1[1][i] = 0;
  }
  for (int i = (sx); i <= int(mid); i++) {
    for (int j = (sy - 1); j <= int(ty); j++) dp1[i & 1][j] = 0;
    for (int j = (sy); j <= int(ty); j++) {
      int v = X[i] + Y[j];
      if (v >= P) v -= P;
      dp1[i & 1][j] = max(dp1[i & 1][j - 1], dp1[~i & 1][j]) + v;
    }
  }
  int my = (sy + ty) >> 1;
  for (int len = (0); len <= int(my); len++) {
    if (my - len >= sy) {
      int i = my - len;
      int v = X[mid] + Y[i];
      if (v >= P) v -= P;
      if (dp1[mid & 1][i] + dp2[mid & 1][i] - v == ans) {
        long long ans1 = dp1[mid & 1][i];
        long long ans2 = dp2[mid & 1][i];
        dq(sx, sy, mid, i, ans1);
        dq(mid, i, tx, ty, ans2);
        return;
      }
    }
    if (my + len <= ty) {
      int i = my + len;
      int v = X[mid] + Y[i];
      if (v >= P) v -= P;
      if (dp1[mid & 1][i] + dp2[mid & 1][i] - v == ans) {
        long long ans1 = dp1[mid & 1][i];
        long long ans2 = dp2[mid & 1][i];
        dq(sx, sy, mid, i, ans1);
        dq(mid, i, tx, ty, ans2);
        return;
      }
    }
  }
}
inline int readint() {
  char c;
  int x;
  for (c = getchar(); !(c >= '0' && c <= '9'); c = getchar())
    ;
  for (x = 0; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + (c - '0');
  return x;
}
int main() {
  N = readint();
  M = readint();
  P = readint();
  for (int i = (1); i <= int(N); i++) {
    X[i] = readint();
    X[i] %= P;
  }
  for (int i = (1); i <= int(M); i++) {
    Y[i] = readint();
    Y[i] %= P;
  }
  for (int i = (1); i <= int(N); i++) {
    for (int j = (0); j <= int(M); j++) dp1[i & 1][j] = 0;
    for (int j = (1); j <= int(M); j++) {
      int v = X[i] + Y[j];
      if (v >= P) v -= P;
      dp1[i & 1][j] = max(dp1[i & 1][j - 1], dp1[~i & 1][j]) + v;
    }
  }
  long long ans = dp1[N & 1][M];
  PL(ans);
  rd.reserve(4 * (N + M));
  dq(1, 1, N, M, ans);
  sort((rd).begin(), (rd).end());
  rd.erase(unique((rd).begin(), (rd).end()), rd.end());
  for (int i = (1); i <= int(((int)rd.size()) - 1); i++) {
    if (rd[i].first == rd[i - 1].first + 1)
      putchar('C');
    else
      putchar('S');
  }
  PL();
  return 0;
}
