#include <bits/stdc++.h>   template <typename T>   inline void SWAP(T &a, T &b) {     T tmp = a;     a = b;     b = tmp;   }   template <typename T>   inline T ABS(const T &val) {     return val < 0 ? -val : val;   }   template <typename T>   inline T MAX(const T &a, const T &b) {     return a > b ? a : b;   }   template <typename T>   inline T MIN(const T &a, const T &b) {     return a < b ? a : b;   }   template <typename T>   inline T SQR(const T &a) {     return a * a;   }   const int INTinf = 2147483647;   const int nINTinf = 0 - 2147483648;   using namespace std;   int n, m, p;   const int SZ = 20002;   int _X[SZ], _Y[SZ];   int A[142][SZ];   int B[141][SZ];   int F[SZ << 1];   int *m1, *m2;   int kol = 0;   long long answ2 = 0L;   string answ =   ;   inline int f(const int &a, const int &b) { return F[_X[a] + _Y[b]]; }   int main() {     cin >> n >> m >> p;     int SZ2 = SZ << 1;     for (int i = 0; i != SZ2; i++) {       F[i] = i % p;     }     for (int i = 0; i != n; i++) cin >> _X[i];     for (int i = 0; i != m; i++) cin >> _Y[i];     m1 = A[0];     m1[0] = f(0, 0);     for (int i = 1; i <= n - 1; i++) {       m1[i] = m1[i - 1] + f(i, 0);     }     int nPos = 0;     for (int i = 1; i <= m - 1; i++) {       if (!nPos) {         copy(m1, m1 + SZ, B[kol++]);       }       nPos++;       if (nPos == 142) nPos = 0;       m2 = A[nPos];       m2[0] = m1[0] + f(0, i);       for (int j = 1; j <= n - 1; j++) {         m2[j] = MAX(m1[j], m2[j - 1]) + f(j, i);       }       m1 = m2;     }     int Y = n - 1;     int X = m - 1;     while (true) {       while (Y && (A[nPos][Y] - f(Y, X) == A[nPos][Y - 1])) {         answ.push_back( C );         answ2 += f(Y, X);         Y--;       }       answ2 += f(Y, X);       answ.push_back( S );       X--;       if (!nPos) {         break;       }       nPos--;     }     kol--;     if (m % 142 != 1) {       kol--;     }     while (kol > -1) {       copy(B[kol], B[kol] + SZ, A[0]);       int to = (kol + 1) * 142;       m1 = A[0];       for (int i = 142 * kol + 1; i != to; i++) {         nPos++;         m2 = A[nPos];         m2[0] = m1[0] + f(0, i);         for (int j = 1; j <= n - 1; j++) {           m2[j] = MAX(m1[j], m2[j - 1]) + f(j, i);         }         m1 = m2;       }       while (true) {         while (Y && (A[nPos][Y] - f(Y, X) == A[nPos][Y - 1])) {           answ.push_back( C );           answ2 += f(Y, X);           Y--;         }         answ2 += f(Y, X);         answ.push_back( S );         X--;         if (!nPos) {           break;         }         nPos--;       }       kol--;     }     answ = answ.substr(0, answ.size() - 1);     reverse(answ.begin(), answ.end());     cout << answ2 << endl;     cout << answ << endl;     return 0;   }   