← Home
package main

import (
	"bufio"
	"io"
	"os"
)

func writeInt(w *bufio.Writer, x int) {
	if x == 0 {
		w.WriteByte('0')
		return
	}
	var buf [20]byte
	i := len(buf)
	for x > 0 {
		i--
		buf[i] = byte('0' + x%10)
		x /= 10
	}
	w.Write(buf[i:])
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		v := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			v = v*10 + int(data[idx]-'0')
			idx++
		}
		return v
	}

	n := nextInt()
	m := nextInt()
	p := nextInt()

	x := make([]int, n)
	maxX := 0
	for i := 0; i < n; i++ {
		v := nextInt() % p
		x[i] = v
		if v > maxX {
			maxX = v
		}
	}

	y := make([]int, m)
	minY := 0
	maxY := 0
	for j := 0; j < m; j++ {
		v := nextInt() % p
		y[j] = v
		if j == 0 || v < minY {
			minY = v
		}
		if v > maxY {
			maxY = v
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	if n == 1 || m == 1 {
		path := make([]byte, n+m-2)
		a, b := 0, 0
		score := x[0] + y[0]
		if score >= p {
			score -= p
		}
		if n == 1 {
			for t := 0; t < m-1; t++ {
				b++
				path[t] = 'S'
				w := x[0] + y[b]
				if w >= p {
					w -= p
				}
				score += w
			}
		} else {
			for t := 0; t < n-1; t++ {
				a++
				path[t] = 'C'
				w := x[a] + y[0]
				if w >= p {
					w -= p
				}
				score += w
			}
		}
		writeInt(out, score)
		out.WriteByte('\n')
		out.Write(path)
		out.WriteByte('\n')
		return
	}

	if maxX+maxY < p {
		path := make([]byte, n+m-2)
		a, b := 0, 0
		score := x[0] + y[0]
		for t := 0; t < len(path); t++ {
			if a == n-1 {
				b++
				path[t] = 'S'
			} else if b == m-1 {
				a++
				path[t] = 'C'
			} else if x[a+1]-x[a] >= y[b+1]-y[b] {
				a++
				path[t] = 'C'
			} else {
				b++
				path[t] = 'S'
			}
			score += x[a] + y[b]
		}
		writeInt(out, score)
		out.WriteByte('\n')
		out.Write(path)
		out.WriteByte('\n')
		return
	}

	cells := n * m
	dirs := make([]uint64, (cells+63)>>6)
	prev := make([]int, m)
	cur := make([]int, m)

	x0 := x[0]
	t0 := p - x0
	if t0 > maxY {
		sum := x0 + y[0]
		prev[0] = sum
		for j := 1; j < m; j++ {
			sum += x0 + y[j]
			prev[j] = sum
		}
	} else if t0 <= minY {
		sum := x0 + y[0] - p
		prev[0] = sum
		for j := 1; j < m; j++ {
			sum += x0 + y[j] - p
			prev[j] = sum
		}
	} else {
		s := x0 + y[0]
		if s >= p {
			s -= p
		}
		prev[0] = s
		sum := s
		for j := 1; j < m; j++ {
			w := x0 + y[j]
			if w >= p {
				w -= p
			}
			sum += w
			prev[j] = sum
		}
	}

	for i := 1; i < n; i++ {
		xi := x[i]
		ti := p - xi
		base := i * m
		wi := (base + 1) >> 6
		bit := uint64(1) << (uint(base+1) & 63)

		if ti > maxY {
			v := prev[0] + xi + y[0]
			cur[0] = v
			left := v
			for j := 1; j < m; j++ {
				w := xi + y[j]
				up := prev[j]
				if up >= left {
					left = up + w
					dirs[wi] |= bit
				} else {
					left += w
				}
				cur[j] = left
				bit <<= 1
				if bit == 0 {
					bit = 1
					wi++
				}
			}
		} else if ti <= minY {
			v := prev[0] + xi + y[0] - p
			cur[0] = v
			left := v
			for j := 1; j < m; j++ {
				w := xi + y[j] - p
				up := prev[j]
				if up >= left {
					left = up + w
					dirs[wi] |= bit
				} else {
					left += w
				}
				cur[j] = left
				bit <<= 1
				if bit == 0 {
					bit = 1
					wi++
				}
			}
		} else {
			w0 := xi + y[0]
			if w0 >= p {
				w0 -= p
			}
			v := prev[0] + w0
			cur[0] = v
			left := v
			for j := 1; j < m; j++ {
				w := xi + y[j]
				if w >= p {
					w -= p
				}
				up := prev[j]
				if up >= left {
					left = up + w
					dirs[wi] |= bit
				} else {
					left += w
				}
				cur[j] = left
				bit <<= 1
				if bit == 0 {
					bit = 1
					wi++
				}
			}
		}

		prev, cur = cur, prev
	}

	score := prev[m-1]
	path := make([]byte, n+m-2)
	i, j := n-1, m-1
	for k := len(path) - 1; k >= 0; k-- {
		if i == 0 {
			path[k] = 'S'
			j--
		} else if j == 0 {
			path[k] = 'C'
			i--
		} else {
			id := i*m + j
			if ((dirs[id>>6] >> (uint(id) & 63)) & 1) != 0 {
				path[k] = 'C'
				i--
			} else {
				path[k] = 'S'
				j--
			}
		}
	}

	writeInt(out, score)
	out.WriteByte('\n')
	out.Write(path)
	out.WriteByte('\n')
}