#include <bits/stdc++.h>
using namespace std;
const int MX = 20009, inf = (1 << 30);
int n, m, X[MX], Y[MX], P, timer;
int getcost(int x, int y) { return (X[x] + Y[y]) % P; }
string sol;
int dp[150][MX];
int table[150][MX];
vector<int> stops;
set<int> ss;
int ptr;
void gen(int L, int R) {
  int len = R - L + 1;
  dp[1][0] = -inf;
  for (int j = 1; j <= m; j++) dp[1][j] = table[timer][j];
  for (int j = 2; j <= len; j++) {
    dp[j][0] = -inf;
    for (int i = 1; i <= m; i++)
      dp[j][i] = getcost(L + j - 1, i) + max(dp[j][i - 1], dp[j - 1][i]);
  }
  int x = len, y = ptr;
  while (1) {
    if (x == 1) break;
    if (dp[x][y] == getcost(L + x - 1, y) + dp[x][y - 1]) {
      sol += "S";
      y--;
    } else {
      sol += "C";
      x--;
    }
  }
  ptr = y;
}
int main() {
  scanf("%d %d %d", &n, &m, &P);
  for (int j = 1; j <= n; j++) scanf("%d", &X[j]);
  for (int j = 1; j <= m; j++) scanf("%d", &Y[j]);
  int lim = ceil(sqrt(n + 0.0));
  stops.push_back(1);
  for (int j = 2; j <= n; j++) {
    if (j - stops.back() == lim) stops.push_back(j);
  }
  if (stops.back() != n) stops.push_back(n);
  for (auto pp : stops) ss.insert(pp);
  timer = 1;
  table[timer][1] = dp[0][1] = getcost(1, 1);
  for (int j = 2; j <= m; j++) {
    table[timer][j] = dp[0][j] = getcost(1, j) + dp[0][j - 1];
  }
  bool cur = 0;
  for (int iter = 2; iter <= n; iter++) {
    cur ^= 1;
    dp[cur][1] = getcost(iter, 1) + dp[cur ^ 1][1];
    for (int j = 2; j <= m; j++)
      dp[cur][j] = getcost(iter, j) + max(dp[cur][j - 1], dp[cur ^ 1][j]);
    if (ss.count(iter) == 0) continue;
    ++timer;
    for (int j = 1; j <= m; j++) table[timer][j] = dp[cur][j];
  }
  cout << dp[cur][m] << endl;
  ptr = m;
  int R = n;
  stops.pop_back();
  while (!stops.empty()) {
    int L = stops.back();
    --timer;
    stops.pop_back();
    gen(L, R);
    R = L;
  }
  while (--ptr) sol += "S";
  reverse(sol.begin(), sol.end());
  cout << sol << endl;
}
