/////////////////////////////////////////////////////////
//
//  c/temp.cpp file
//  Last Updated: 2018-10-23 ...Maybe
//
//    I hope you adding this code to the setting file
//    alias g++='g++ -std=c++1y -DDEBUG_LOCAL'
//
/////////////////////////////////////////////////////////

#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back

//#define int long long

#define _overload3(_1,_2,_3,name,...) name
#define _REP(i,n) REAP(i,0,n)
#define REAP(i,a,b) for(int i=int(a);i<int(b);++i)
#define REP(...) _overload3(__VA_ARGS__,REAP,_REP,)(__VA_ARGS__)

#define _REPR(i,n) REAPR(i,n,0)
#define REAPR(i,a,b) for(int i=int(a-1);i>=int(b);--i)
#define REPR(...) _overload3(__VA_ARGS__,REAPR,_REPR,)(__VA_ARGS__)

#define ALL(a) a.begin(),a.end()
#define rALL(a) a.rbegin(),a.rend()

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

using vi=vector<int>;
using vvi=vector<vi>;
using vs=vector<string>;

typedef pair<int,int> pii;
typedef pair<int,string> pis;
typedef pair<string,int> psi;
typedef pair<string,string> pss;

typedef long long ll;

template<typename T> istream &operator >> (istream &is, vector<T> &v){for(T &x:v) is>>x;return is;}
template<typename T> ostream &operator << (ostream &os, vector<T> &v){int i=0;for(T &x:v) os<<(i++?" ":"")<<x;return os;}

bool inG(ll x,ll n){return 0<=x && x<n;}
bool outG(ll x,ll n){return x<0 || n<=x;}

const int dx9[]={-1,-1,-1,0,1,1,1,0,0},dy9[]={-1,0,1,1,1,0,-1,-1,0};

#define MAX_HW 1000000

int d[MAX_HW];
vector <pii> g[MAX_HW];
void dijk(int V,int s){

  priority_queue <pii,vector<pii>,greater<pii> > que;
  fill(d,d+V,INF);

  d[s]=0;

  que.push(pii(0,s));

  for(;!que.empty();){

    pii p=que.top(); que.pop();
    int v=p.se;

    if (d[v]<p.fi) continue;

    for(int i=0;i<(int)g[v].size();i++){

      pii e=g[v][i]; //fiが場所、seがコスト

      if(d[e.fi]>d[v]+e.se){

	       d[e.fi]=d[v]+e.se;
	       que.push(pii(d[e.fi],e.fi));

      }
    }
  }
}

signed main(){

  int h,w,a,b;
  cin>>h>>w>>a>>b;

  vs s(h);

  cin>>s;

  int st=-1,go=-1;

  REP(i,h) REP(j,w){

    bool isbom=false;

    if(s[i][j] == 's') st=i*w+j;
    if(s[i][j] == 'g') go=i*w+j;

    REP(dir,9){

      int y=i+dy9[dir],x=j+dx9[dir];

      if(outG(y,h) || outG(x,w)) continue;

      if(s[y][x] == '*') isbom=true;

    }

    REP(dir,4){

      int y=i+dy[dir],x=j+dx[dir];

      if(outG(y,h) || outG(x,w)) continue;

      if(s[y][x] != '#') g[i*w+j].pb(mp(y*w+x,a));
      if(!isbom){

        g[i*w+j].pb(mp(y*w+x,a+b));

        int y_=y,x_=x;

        if(dy[dir]) x_+=dy[dir];
        else y_-=dx[dir];

        if(inG(y_,h) && inG(x_,w)) g[i*w+j].pb(mp(y_*w+x_,a*2+b));


        // y_=y,x_=x;
        //
        // if(dy[dir]) x_-=dy[dir];
        // else y_-=dx[dir];
        //
        // if(!(outG(y_,h) || outG(x_,w))) g[i*w+j].pb(mp(y_*w+x_,a*2+b));

      }

    }

  }

  dijk(h*w,st);

  if(d[go] == INF) cout<<"INF"<<endl;
  else cout<<d[go]<<endl;

  return 0;

}

