#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;
}