import sys from collections import deque readline = sys.stdin.readline input_value = readline().split() H = int(input_value[0]) W = int(input_value[1]) grid = [None] * H for h in range(H): grid[h] = readline().rstrip().replace('S', '.').replace('G', '.') can_reach_goal = [[False] * W for _ in range(H)] if grid[H-1][W-1] == '.': can_reach_goal[H-1][W-1] = True for y in range(H-1, -1, -1): for x in range(W-1, -1, -1): if grid[y][x] == '.': if y + 1 < H and can_reach_goal[y+1][x]: can_reach_goal[y][x] = True if x + 1 < W and can_reach_goal[y][x+1]: can_reach_goal[y][x] = True row_has_reach = [[False] * W for _ in range(H)] col_has_reach = [[False] * W for _ in range(H)] for y in range(H): has_reach = False for x in range(W-1, -1, -1): if can_reach_goal[y][x]: has_reach = True row_has_reach[y][x] = has_reach for x in range(W): has_reach = False for y in range(H-1, -1, -1): if can_reach_goal[y][x]: has_reach = True col_has_reach[y][x] = has_reach dist = [[-1] * W for _ in range(H)] queue = deque() dist[0][0] = 0 queue.append((0,0)) dy = [-1, 1, 0, 0] dx = [0, 0, -1, 1] Magic = H + W ans = -1 check_point = False while queue: y, x = queue.popleft() if y == H - 1 and x == W - 1: ans = dist[y][x] break if dist[y][x] == y + x: if y + 1 < H and row_has_reach[y + 1][x]: check_point = True if x + 1 < W and col_has_reach[y][x + 1]: check_point = True for i in range(4): ny = y + dy[i] nx = x + dx[i] if 0 <= ny < H and 0 <= nx < W: if grid[ny][nx] == '.' and dist[ny][nx] == -1: dist[ny][nx] = dist[y][x] + 1 queue.append((ny, nx)) if check_point: if ans == -1 or ans > Magic - 1: ans = Magic - 1 else: if ans == -1 or ans > Magic: ans = Magic print(ans)