#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,ans;
int st;
};
int sx,sy,ex,ey;
int n,m,v;
int dx[4]={0,1,0,-1};//方向
int dy[4]={1,0,-1,0};
bool vis[35][35][(1<<11)];
int maze[35][35];
int k[35][35][35];//锁
bool in(int x,int y){
return 1<=x&&x<=n&&1<=y&&y<=m;
}
int BFS(){
queue<node> Q;
Q.push((node){sx,sy,0,0});
vis[sx][sy][0]=1;//锁
while(Q.size()){
node t=Q.front();
Q.pop();
if(t.x==ex&&t.y==ey){
cout<<t.ans;
exit(0);
}
for(int i=0;i<4;i++){
int nx=t.x+dx[i];
int ny=t.y+dy[i];
if(in(nx,ny)==0
||maze[nx][ny]==-1
||vis[nx][ny][t.st]==1) continue;//判断
if((maze[nx][ny])!=0){
if(((1<<(maze[nx][ny]-1))&t.st)==0) continue;
}//有锁无钥匙
int sum=t.st;
for(int j=1;j<=k[nx][ny][0];j++){
sum|=(1<<(k[nx][ny][j]-1));
}//开锁
vis[nx][ny][sum]=1;//锁
Q.push((node){nx,ny,t.ans+1,sum});//入队
}
}
cout<<-1;
}
int main(){
cin>>n>>m;
char p;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>p;
if(p=='#') maze[i][j]=-1;//墙
if(p=='S') sx=i,sy=j;
if(p=='T') ex=i,ey=j;
}
}
cin>>v;
for(int i=1;i<=v;i++){
int x,y,u,v;
cin>>x>>y>>u>>v;
k[x][y][0]++;//同地点数
k[x][y][k[x][y][0]]=i;//锁的编号
maze[u][v]=i;
}
BFS();
return 0;
}
小号关