

from __future__ import annotations

import random

# Adjacency list representation of this graph:
# https://en.wikipedia.org/wiki/File:Single_run_of_Karger%E2%80%99s_Mincut_algorithm.svg
_a 	=       {
    '''1''': ['''2''', '''3''', '''4''', '''5'''],
    '''2''': ['''1''', '''3''', '''4''', '''5'''],
    '''3''': ['''1''', '''2''', '''4''', '''5''', '''10'''],
    '''4''': ['''1''', '''2''', '''3''', '''5''', '''6'''],
    '''5''': ['''1''', '''2''', '''3''', '''4''', '''7'''],
    '''6''': ['''7''', '''8''', '''9''', '''10''', '''4'''],
    '''7''': ['''6''', '''8''', '''9''', '''10''', '''5'''],
    '''8''': ['''6''', '''7''', '''9''', '''10'''],
    '''9''': ['''6''', '''7''', '''8''', '''10'''],
    '''10''': ['''6''', '''7''', '''8''', '''9''', '''3'''],
}







def _a			(	SCREAMING_SNAKE_CASE		:      dict[str, list[str]]		)   ->   set[tuple[str, str]]:

 """simple docstring"""






 __lowerCAmelCase:       Optional[int]            =				{node: {node} for node in graph}

 __lowerCAmelCase:       Tuple            =				{node: graph[node][:] for node in graph}

 while len(SCREAMING_SNAKE_CASE		) > 2:
  # Choose a random edge.
  __lowerCAmelCase:       Tuple            =				random.choice(list(graph_copy.keys()		)		)
  __lowerCAmelCase:       List[str]            =				random.choice(graph_copy[u]		)

  # Contract edge (u, v) to new node uv
  __lowerCAmelCase:       Optional[Any]            =				u + v
  __lowerCAmelCase:       List[Any]            =				list(set(graph_copy[u] + graph_copy[v]		)		)
  uv_neighbors.remove(SCREAMING_SNAKE_CASE		)
  uv_neighbors.remove(SCREAMING_SNAKE_CASE		)
  __lowerCAmelCase:       str            =				uv_neighbors
  for neighbor in uv_neighbors:
   graph_copy[neighbor].append(SCREAMING_SNAKE_CASE		)

  __lowerCAmelCase:       List[Any]            =				set(contracted_nodes[u].union(contracted_nodes[v]		)		)

  # Remove nodes u and v.
  del graph_copy[u]
  del graph_copy[v]
  for neighbor in uv_neighbors:
   if u in graph_copy[neighbor]:
    graph_copy[neighbor].remove(SCREAMING_SNAKE_CASE		)
   if v in graph_copy[neighbor]:
    graph_copy[neighbor].remove(SCREAMING_SNAKE_CASE		)

    # Find cutset.
 __lowerCAmelCase:       str            =				[contracted_nodes[node] for node in graph_copy]
 return {
     (node, neighbor)
     for node in groups[0]
     for neighbor in graph[node]
     if neighbor in groups[1]
 }


if __name__ == "__main__":
  print(partition_graph(TEST_GRAPH))








def _a			(	SCREAMING_SNAKE_CASE		:      int = 10_00		)   ->   int:

 """simple docstring"""






 __lowerCAmelCase:       Union[str, Any]            =				[0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8]
 # number of letters in twenty, thirty, ..., ninety (0 for numbers less than
 # 20 due to inconsistency in teens)
 __lowerCAmelCase:       Union[str, Any]            =				[0, 0, 6, 6, 5, 5, 5, 7, 6, 6]

 __lowerCAmelCase:       Optional[int]            =				0

 for i in range(1   , n + 1		):
  if i < 10_00:
   if i >= 1_00:
    # add number of letters for "n hundred"
    count += ones_counts[i // 1_00] + 7

    if i % 1_00 != 0:
     # add number of letters for "and" if number is not multiple
     # of 100
     count += 3

   if 0 < i % 1_00 < 20:
    # add number of letters for one, two, three, ..., nineteen
    # (could be combined with below if not for inconsistency in
    # teens)
    count += ones_counts[i % 1_00]
   else:
    # add number of letters for twenty, twenty one, ..., ninety
    # nine
    count += ones_counts[i % 10]
    count += tens_counts[(i % 1_00 - i % 10) // 10]
  else:
   count += ones_counts[i // 10_00] + 8
 return count


if __name__ == "__main__":
  print(solution(int(input().strip())))





