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 <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <numeric>
#include <cctype>
#include <tuple>
#include <array>
#include <climits>

// BEGIN CUT HERE
#ifdef _MSC_VER
#include <agents.h>
#endif
// END CUT HERE 

#define FOR(i, a, b) for(int i = (a); i < (int)(b); ++i)
#define rep(i, n) FOR(i, 0, n)
#define ALL(v) v.begin(), v.end()
#define REV(v) v.rbegin(), v.rend()
#define MEMSET(v, s) memset(v, s, sizeof(v))
#define MP make_pair
#define MT make_tuple

using namespace std;

typedef pair<int, int> P;
typedef long long ll;

const int N = 1e5 + 10;

vector<int> G[N];

struct state{
	int r, c, t, d;
	bool operator < (const state &rhs) const{
		return d > rhs.d;
	}
};

int dist[25][25][210];

int dx[] = { 0, 1, 0, -1, 0 };
int dy[] = { -1, 0, 1, 0, 0 };

inline int &getdist(state &s){
	return dist[s.r][s.c][s.t];
}

void go(state nxt, priority_queue<state> &q){
	int &d = getdist(nxt);
	if (d <= nxt.d) return;
	d = nxt.d;
	q.push(nxt);
}

int a[210];

int main(){
	int h, w;
	cin >> h >> w;
	vector<string> tmp(h);
	rep(i, h) cin >> tmp[i];
	int n;
	cin >> n;
	vector<vector<string>> area(n+1, vector<string>(h));
	area[0] = tmp;

	MEMSET(a, -1);
	a[0] = 0;
	FOR(i, 1, n + 1){
		int x;
		cin >> x;
		a[x] = i;
		rep(j, h) cin >> area[i][j];
	}
	rep(i, 200) if (a[i + 1] < 0) a[i + 1] = a[i];

	rep(i, 25) rep(j, 25) rep(k, 210) dist[i][j][k] = 1e9;

	P start, goal;
	rep(i, h) rep(j, w){
		if (tmp[i][j] == 'S') start = MP(i, j);
		if (tmp[i][j] == 'G') goal = MP(i, j);
	}

	priority_queue<state> q;
	go({ start.first, start.second, 0, 0 }, q);
	while (!q.empty()){
		auto s = q.top();
		q.pop();

		if (getdist(s) < s.d) continue;

		if (s.r == goal.first && s.c == goal.second){
			cout << s.d << endl;
			return 0;
		}

		s.t = min(s.t+1, 200);
		++s.d;
		rep(d, 5){
			state nxt = s;
			if (d == 4) --nxt.d;
			nxt.r += dx[d], nxt.c += dy[d];
			if (nxt.r < 0 || nxt.r >= h || nxt.c < 0 || nxt.c >= w) continue;
			int na = a[nxt.t];
			if (area[na][nxt.r][nxt.c] == '#') continue;
			go(nxt, q);
		}
	}
	cout << -1 << endl;

	return 0;
}