import os







def 			__UpperCamelCase     (    A				):
     UpperCamelCase__					    =   len(grid[0]				)
     UpperCamelCase__					    =   len(SCREAMING_SNAKE_CASE__				)

     UpperCamelCase__					    =   0
     UpperCamelCase__					    =   0
     UpperCamelCase__					    =   0

     # Check vertically, horizontally, diagonally at the same time (only works
     # for nxn grid)
     for i in range(SCREAMING_SNAKE_CASE__				):
          for j in range(n_rows - 3				):
               UpperCamelCase__					    =   grid[j][i] * grid[j + 1][i] * grid[j + 2][i] * grid[j + 3][i]
               UpperCamelCase__					    =   grid[i][j] * grid[i][j + 1] * grid[i][j + 2] * grid[i][j + 3]

               # Left-to-right diagonal (\) product
               if i < n_columns - 3:
                    UpperCamelCase__					    =   (
                        grid[i][j]
                        * grid[i + 1][j + 1]
                        * grid[i + 2][j + 2]
                        * grid[i + 3][j + 3]
                    )

               # Right-to-left diagonal(/) product
               if i > 2:
                    UpperCamelCase__					    =   (
                        grid[i][j]
                        * grid[i - 1][j + 1]
                        * grid[i - 2][j + 2]
                        * grid[i - 3][j + 3]
                    )

               UpperCamelCase__					    =   max(
                   SCREAMING_SNAKE_CASE__			,				SCREAMING_SNAKE_CASE__			,				SCREAMING_SNAKE_CASE__			,				SCREAMING_SNAKE_CASE__				)
               if max_product > largest:
                    UpperCamelCase__					    =   max_product

     return largest







def 			__UpperCamelCase     (    ):
     UpperCamelCase__					    =   []
     with open(os.path.dirname(SCREAMING_SNAKE_CASE__				) + '''/grid.txt'''				) as file:
          for line in file:
               grid.append(line.strip('''\n'''				).split(''' '''				)				)

     UpperCamelCase__					    =   [[int(SCREAMING_SNAKE_CASE__				) for i in grid[j]] for j in range(len(SCREAMING_SNAKE_CASE__				)				)]

     return largest_product(SCREAMING_SNAKE_CASE__				)


if __name__ == "__main__":
     print(solution())







'''simple docstring'''


def      snake_case_  (    SCREAMING_SNAKE_CASE__				, SCREAMING_SNAKE_CASE__	):







				"""simple docstring"""





				print("""\nThe shortest path matrix using Floyd Warshall algorithm\n"""	)
				for i in range(SCREAMING_SNAKE_CASE__	):
								for j in range(SCREAMING_SNAKE_CASE__	):
												if dist[i][j] != float("""inf"""	):
																print(int(dist[i][j]	)				, end="""\t"""	)
												else:
																print("""INF"""				, end="""\t"""	)
								print()







def      snake_case_  (    SCREAMING_SNAKE_CASE__				, SCREAMING_SNAKE_CASE__	):







				"""simple docstring"""





				_SCREAMING_SNAKE_CASE					:			Any							= [[float("""inf"""	) for _ in range(SCREAMING_SNAKE_CASE__	)] for _ in range(SCREAMING_SNAKE_CASE__	)]

				for i in range(SCREAMING_SNAKE_CASE__	):
								for j in range(SCREAMING_SNAKE_CASE__	):
												_SCREAMING_SNAKE_CASE					:			List[str]							= graph[i][j]

												# check vertex k against all other vertices (i, j)
				for k in range(SCREAMING_SNAKE_CASE__	):
								# looping through rows of graph array
								for i in range(SCREAMING_SNAKE_CASE__	):
												# looping through columns of graph array
												for j in range(SCREAMING_SNAKE_CASE__	):
																if (
																    dist[i][k] != float("""inf"""	)
																    and dist[k][j] != float("""inf"""	)
																    and dist[i][k] + dist[k][j] < dist[i][j]
																):
																				_SCREAMING_SNAKE_CASE					:			int							= dist[i][k] + dist[k][j]

				_print_dist(SCREAMING_SNAKE_CASE__				, SCREAMING_SNAKE_CASE__	)
				return dist, v


if __name__ == "__main__":
				UpperCAmelCase_						:  str				  =						int(input('Enter number of vertices: '))
				UpperCAmelCase_						:  Union[str, Any]				  =						int(input('Enter number of edges: '))

				UpperCAmelCase_						:  Dict				  =						[[float('inf') for i in range(v)] for j in range(v)]

				for i in range(v):
								UpperCAmelCase_						:  Union[str, Any]				  =						0.0

								# src and dst are indices that must be within the array size graph[e][v]
								# failure to follow this will result in an error
				for i in range(e):
								print('\nEdge ', i + 1)
								UpperCAmelCase_						:  int				  =						int(input('Enter source:'))
								UpperCAmelCase_						:  List[str]				  =						int(input('Enter destination:'))
								UpperCAmelCase_						:  List[str]				  =						float(input('Enter weight:'))
								UpperCAmelCase_						:  int				  =						weight

				floyd_warshall(graph, v)

				# Example Input
				# Enter number of vertices: 3
				# Enter number of edges: 2

				# # generated graph from vertex and edge inputs
				# [[inf, inf, inf], [inf, inf, inf], [inf, inf, inf]]
				# [[0.0, inf, inf], [inf, 0.0, inf], [inf, inf, 0.0]]

				# specify source, destination and weight for edge #1
				# Edge  1
				# Enter source:1
				# Enter destination:2
				# Enter weight:2

				# specify source, destination and weight for edge #2
				# Edge  2
				# Enter source:2
				# Enter destination:1
				# Enter weight:1

				# # Expected Output from the vertice, edge and src, dst, weight inputs!!
				# 0		INF	INF
				# INF	0	2
				# INF	1	0




