#include <bits/stdc++.h>

using namespace std;
char Map[2005][2005];
int vis[2005][2005]={},m,n,tong[30]={};
int startX,startY,endX,endY;
int dx[5]={0,1,0,-1,0},dy[5]={1,0,-1,0,0};
struct Door{
	int x1,y1,x2,y2;
}door[200];
void dfs(int x,int y,int step){
	if(x==endX&&y==endY){
		cout<<step;
		return ;
	}
	for(int i=0;i<=4;i++){
		if(i==4&&97<=Map[x][y]<=122){
			vis[Map[x][y]]++;
			dfs(door[Map[x][y]].x2,door[Map[x][y]].y2,step+1);
			return;
		}
		int nx=x+dx[i];
		int ny=y+dy[i];
		if(0<=nx<=n&&0<=ny<=m&&Map[nx][ny]!='#'&&vis[nx][ny]==0){
			vis[Map[i][j]]=1;
			dfs(nx,ny,step+1);
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>Map[i][j];
			if(97<=Map[i][j]<=122){
				if(tong[Map[i][j]]==0){
					tong[Map[i][j]]++;
					door[Map[i][j]].x1=i;
					door[Map[i][j]].y1=j;
				}else{
					door[Map[i][j]].x2=i;
					door[Map[i][j]].y2=j;
				}
			}if(Map[i][j]=='S'){
				startX=i;
				startY=j;
			}if(Map[i][j]=='G'){
				endX=i;
				endY=j;
			}
		}
	}
	
	vis[startX][startY]=1;
	dfs(startX,startY,0);
	
	
	
	
	return 0;
}
#include <bits/stdc++.h>

using namespace std;

int n,a[50],t,dp[1000005];
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=t;i++){
		dp[i]=max(dp[i-1],dp[i-a[i]]+a[i]);
	}
	cout<<dp[t];
	
	
	
	
	
	return 0;
}