```go
package main
import (
"bufio"
"fmt"
"os"
)
type Step struct {
f int
s string
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n, m int
var k int64
fmt.Fscan(in, &n, &m, &k)
maxEdges := int64(4*n*m - 2*n - 2*m)
if k > maxEdges {
fmt.Println("NO")
return
}
fmt.Println("YES")
var steps []Step
remaining := int(k)
if n == 1 && m == 1 {
// k must be 0, but k>=1, so handled by maxEdges check (0)
} else if n == 1 {
// Only horizontal
take := min(remaining, m-1)
if take > 0 {
steps = append(steps, Step{take, "R"})
remaining -= take
}
if remaining > 0 {
steps = append(steps, Step{remaining, "L"})
remaining = 0
}
} else if m == 1 {
// Only vertical
take := min(remaining, n-1)
if take > 0 {
steps = append(steps, Step{take, "D"})
remaining -= take
}
if remaining > 0 {
steps = append(steps, Step{remaining, "U"})
remaining = 0
}
} else {
// General case
for row := 1; row < n && remaining > 0; row++ {
dir := "R"
if row%2 == 0 {
dir = "L"
}
if remaining >= 3*(m-1)+1 {
s := "RDU"
if dir == "L" {
s = "LDU"
}
steps = append(steps, Step{m - 1, s})
remaining -= 3 * (m - 1)
steps = append(steps, Step{1, "D"})
remaining -= 1
} else {
take := min(remaining, m-1)
if take > 0 {
steps = append(steps, Step{take, dir})
remaining -= take
}
if remaining > 0 && take == m-1 {
steps = append(steps, Step{1, "D"})
remaining -= 1
}
}
}
if remaining > 0 {
row := n
dir := "R"
if row%2 == 0 {
dir = "L"
}
opp := "L"
if dir == "L" {
opp = "R"
}
for remaining > 0 {
take := min(remaining, m-1)
steps = append(steps, Step{take, dir})
remaining -= take
if remaining == 0 {
break
}
take = min(remaining, m-1)
steps = append(steps, Step{take, opp})
remaining -= take
dir, opp = opp, dir
}
}
}
fmt.Fprintln(out, len(steps))
for _, step := range steps {
fmt.Fprintln(out, step.f, step.s)
}
}
```