Problem: Background

Mr. A and Mr. B are enthusiastic about the game "Changing Grids". This game is for two players, with player 1 forming the stage and player 2 challenging the stage and aiming for the goal.

Now, A and B have played this game several times, but B has never won because of A's winning streak. So you decided to give B some tips on how to capture this game.

Problem

The state of the two-dimensional grid with the size of vertical H × horizontal W at time T0 = 0 is given as Area 0. Next, the state of this grid switches to the state Areai at time Ti. This switching process is repeated N times. The initial grid is given a start position'S'and a goal position'G'. If you can reach the goal on any grid, output the minimum number of steps at that time, and if you cannot reach the goal, output'-1'. The following conditions must also be met.


* Areai consists of the following elements.
* ‘.’ Is a movable mass without anything
* ‘#’ Is an obstacle and cannot be moved.
*'S' is the square that represents the start position
*'G' is a square that represents the goal position
* It takes 1 second for the player to move to or stay in the current square, either up, down, left, or right adjacent to the current square. However, it cannot move outside the range of obstacle squares or grids.
* The number of steps increases by 1 when you move 1 square from the square where the player is currently to the squares up, down, left, and right. It does not increase if you stay on the spot.
* The size of all grids is vertical H x horizontal W.
* 1 When the grid is switched after moving or staying in place, it is possible to move regardless of the current grid state as long as there are no obstacles in the next grid.
* In all grids, if the goal position given to the initial grid is reached, it is considered as a goal.

Constraints

The input satisfies the following conditions.

* 2 ≤ H, W ≤ 20
* 1 ≤ N ≤ 15
* 1 ≤ Ti ≤ 200 (T1 <T2 <... <TN)
* There is only one start position'S'and one goal position'G' in the initial 2D grid.

Input

The input is given in the following format.


H W
Area0
N
T1
Area1
T2
Area2
..
..
TN
AreaN


Two integers H and W are given on the first line, separated by blanks. This represents the vertical and horizontal dimensions of the two-dimensional grid, respectively. The initial state of the two-dimensional grid is given to each line from the second line to the H + 1 line. The integer N is given on the second line of H +. This represents the number of changes in the 2D grid. The time Ti and the state of switching of N 2D grids are given after the 3rd line of H +. However, Ti is all integers.

Output

Output the minimum number of steps to reach the goal from the start. However, if you cannot reach the goal, output'-1'.

Examples

Input

2 2
S.
.G
1
3
##
##


Output

2


Input

2 2
S.
.G
1
3


Output

2


Input

2 2
S.
.G
1
2


Output

-1


Input

2 3
S##
G
4
2

.##
3

.#
5

.
7


Output

3


Input

4 3
S..
...
.G.
...
4
2

.#

.#
4

..
..

6

.#

..
8

..
..


Output

3


Input

3 3
S##

G
1
1
...
...
...


Output

4

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Loc{

	void set(int arg_row,int arg_col){
		row = arg_row;
		col = arg_col;
	}
	int row,col;
};

int H,W;
int num_map;
int change_time[16];
int diff_row[5] = {-1,0,0,0,1},diff_col[5] = {0,-1,0,1,0};
char table[16][25][25];
int check[2][25][25];

bool rangeCheck(Loc loc){

	if(loc.row >= 0 && loc.row <= H-1 && loc.col >= 0 && loc.col <= W-1){

		return true;

	}else{

		return false;
	}
}

int main(){

	scanf("%d %d",&H,&W);

	Loc start,goal;

	for(int row = 0; row < H; row++){

		scanf("%s",table[0][row]);
		for(int col = 0; col < W; col++){
			if(table[0][row][col] == 'S'){

				start.set(row,col);

			}else if(table[0][row][col] == 'G'){

				goal.set(row,col);
			}
		}
	}

	scanf("%d",&num_map);

	for(int i = 1; i <= num_map; i++){

		scanf("%d",&change_time[i]);

		for(int row = 0; row < H; row++){

			scanf("%s",table[i][row]);
		}
	}

	int limit = change_time[num_map]+H*W;
	int CURRENT = 0,NEXT = 1;

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){

			check[CURRENT][row][col] = BIG_NUM;
			check[NEXT][row][col] = BIG_NUM;
		}
	}
	check[CURRENT][start.row][start.col] = 0;

	int ans = BIG_NUM;
	Loc next_loc;
	int next_time,next_map,next_cost,current_map = 0;

	//printf("limit:%d\n",limit);

	for(int current_time = 0; current_time <= limit; current_time++){

		//1病後のマップ
		if(current_map < num_map && current_time+1 == change_time[current_map+1]){

			next_map = current_map+1;

		}else{

			next_map = current_map;
		}

		for(int row = 0; row < H; row++){
			for(int col = 0; col < W; col++){

				if(check[CURRENT][row][col] == BIG_NUM || check[CURRENT][row][col] >= ans)continue;

				for(int i = 0; i < 5; i++){
					next_loc.row = row+diff_row[i];
					next_loc.col = col+diff_col[i];

					if(rangeCheck(next_loc) == false || table[next_map][next_loc.row][next_loc.col] == '#')continue;

					next_cost = check[CURRENT][row][col];

					if(i != 2){
						next_cost++;
					}

					check[NEXT][next_loc.row][next_loc.col] = min(check[NEXT][next_loc.row][next_loc.col],next_cost);
				}
			}
		}

		ans = min(ans,check[NEXT][goal.row][goal.col]);
		swap(CURRENT,NEXT);

		for(int row = 0; row < H; row++){
			for(int col = 0; col < W; col++){

				check[NEXT][row][col] = BIG_NUM;
			}
		}

		current_map = next_map;
	}

	if(ans == BIG_NUM){

		printf("-1\n");
	}else{

		printf("%d\n",ans);
	}

	return 0;
}