package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
k64, _ := strconv.ParseInt(scanner.Text(), 10, 64)
k := int(k64)
var m int
for i := 100; i >= 3; i-- {
c3 := i * (i - 1) * (i - 2) / 6
if c3 <= k {
m = i
break
}
}
c3 := m * (m - 1) * (m - 2) / 6
e := k - c3
tri := make(map[int]int)
for d := 2; d <= m; d++ {
val := d * (d - 1) / 2
tri[val] = d
}
var list []int
if e > 0 {
list = findRep(e, tri)
}
n := m + len(list)
adj := make([][]byte, n)
for i := 0; i < n; i++ {
adj[i] = make([]byte, n)
}
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
adj[i][j] = '0'
}
}
for i := 0; i < m; i++ {
for j := 0; j < m; j++ {
if i != j {
adj[i][j] = '1'
adj[j][i] = '1'
}
}
}
for idx, val := range list {
v := m + idx
d := tri[val]
for j := 0; j < d; j++ {
adj[v][j] = '1'
adj[j][v] = '1'
}
}
fmt.Println(n)
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
fmt.Print(string(adj[i][j]))
}
fmt.Println()
}
}
func findRep(e int, tri map[int]int) []int {
if _, ok := tri[e]; ok {
return []int{e}
}
for val1 := range tri {
if val1 > e {
continue
}
val2 := e - val1
if val2 >= val1 {
if _, ok := tri[val2]; ok {
return []int{val1, val2}
}
}
}
for val1 := range tri {
if val1 > e {
continue
}
for val2 := range tri {
if val2 > val1 || val1+val2 > e {
continue
}
val3 := e - val1 - val2
if val3 >= val2 {
if _, ok := tri[val3]; ok {
return []int{val1, val2, val3}
}
}
}
}
return []int{}
}