#include <bits/stdc++.h>
using namespace std;
const int maxn = 20000;
int n, m, p, i, j;
int X[maxn], Y[maxn];
int resX[maxn << 1], resY[maxn << 1];
int dp[maxn << 1], pd[maxn << 1];
int LX, RX, lx, rx;
int Ans, res;
void Max(int &x, int y) {
  if (x < y) x = y;
}
int V(int x, int y) { return (X[x] + Y[y]) % p; }
void GetMid(int X1, int Y1, int X2, int Y2) {
  int mid = (X1 + Y1 + X2 + Y2) >> 1;
  dp[X1] = V(X1, Y1);
  lx = rx = X1;
  for (i = X1 + Y1 + 1; i <= mid; i++) {
    LX = max(X1, i - Y2);
    RX = min(X2, i - Y1);
    for (j = RX; j >= LX; j--) {
      res = 0;
      if (lx <= j && j <= rx) res = dp[j];
      if (lx <= j - 1 && j - 1 <= rx) Max(res, dp[j - 1]);
      dp[j] = res + V(j, i - j);
    }
    lx = LX;
    rx = RX;
  }
  pd[X2] = V(X2, Y2);
  lx = rx = X2;
  for (i = X2 + Y2 - 1; i >= mid; i--) {
    LX = max(X1, i - Y2);
    RX = min(X2, i - Y1);
    for (j = LX; j <= RX; j++) {
      res = 0;
      if (lx <= j && j <= rx) res = pd[j];
      if (lx <= j + 1 && j + 1 <= rx) Max(res, pd[j + 1]);
      pd[j] = res + V(j, i - j);
    }
    lx = LX;
    rx = RX;
  }
  int tar = res = -1;
  for (i = lx; i <= rx; i++) {
    dp[i] = dp[i] + pd[i] - V(i, mid - i);
    if (dp[i] > res) res = dp[i], tar = i;
  }
  Max(Ans, res);
  resX[mid] = tar;
  resY[mid] = mid - tar;
  if (mid - (X1 + Y1) > 1) GetMid(X1, Y1, tar, mid - tar);
  if ((X2 + Y2) - mid > 1) GetMid(tar, mid - tar, X2, Y2);
}
int main() {
  scanf("%d%d%d", &n, &m, &p);
  for (i = 0; i < n; i++) scanf("%d", X + i);
  for (i = 0; i < m; i++) scanf("%d", Y + i);
  resX[n + m - 2] = n - 1;
  resY[n + m - 2] = m - 1;
  GetMid(0, 0, n - 1, m - 1);
  printf("%d\n", Ans);
  for (i = 1; i < n + m - 1; i++) putchar((resX[i] == resX[i - 1]) ? 'S' : 'C');
  return 0;
}
