#include<stdio.h>
#include<iostream>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<functional>
#include<string>
#include<algorithm>
#include<time.h>
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
template <class T> inline void scand(T &x){char c;x=0;while((c=getchar())<'0');while(c>='0'&&c<='9')x=x*10+(c-48),c=getchar();}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned int UI;
typedef int Int;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
using namespace std;
const int N=20,M=0,L=2e6,Z=1e9+7,maxint=2147483647,ms31=522133279,ms63=1061109567,ms127=2139062143;
const double eps=1e-10,PI=acos(-1.0);
const int dy[4]={-1,0,0,1},dx[4]={0,-1,1,0};
map<int,int>mop;
int casenum,casei;
int id;
int n,m,i,j,h,t;
char a[N][N];
int b[N][N];
int vis[N][N];
int qy[L],qx[L];
double A[225+5][225+5];
int sty,stx;
bool flag;
void inq(int y,int x)
{
if(y<1||y>n||x<1||x>m||a[y][x]=='#'||~vis[y][x])return;
vis[y][x]=id++;
if(a[y][x]=='$'){flag=1;return;}
qy[t]=y;
qx[t++]=x;
}
void bfs()
{
MS(vis,-1);flag=0;
h=t=0;inq(sty,stx);
while(h<t)
{
int y=qy[h];
int x=qx[h++];
b[y][x]=4;
for(int i=0;i<4;i++)
{
if(a[y+dy[i]][x+dx[i]]=='#')b[y][x]--;
else inq(y+dy[i],x+dx[i]);
}
}
}
void build_matrix()
{
MS(A,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)if(~vis[i][j])
{
int u=vis[i][j];
A[u][u]=1;
if(a[i][j]=='$')continue;
A[u][id]=1;
double p=1.0/b[i][j];
for(int k=0;k<4;k++)
{
int y=i+dy[k];
int x=j+dx[k];
if(~vis[y][x])
{
int v=vis[y][x];
A[u][v]=-p;
}
}
}
}
}
void gauss_jordan(int equ,int val)
{
int i,j,r,c,maxr;
for(r=c=0;r<equ&&c<val;c++)
{
maxr=r;
for(i=r+1;i<equ;i++)if(fabs(A[i][c])>fabs(A[maxr][c]))maxr=i;
if(fabs(A[maxr][c])<eps)continue;
if(maxr!=r)
{
for(j=c;j<=val;j++)swap(A[maxr][j],A[r][j]);
}
for(i=r+1;i<equ;i++)if(fabs(A[i][c])>eps)
{
double k=A[i][c]/A[r][c];
for(j=c;j<=val;j++)A[i][j]-=k*A[r][j];
}
r++;
}
for(c=val-1;c>=1;c--)
{
for(r=c-1;r>=0;r--)if(fabs(A[r][c])>eps)
{
A[r][id]-=A[r][c]/A[c][c]*A[c][id];
A[r][c]=0;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
id=0;
for(i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
for(j=1;j<=m;j++)if(a[i][j]=='@')
{
sty=i;
stx=j;
}
}
for(i=0;i<=n+1;i++)a[i][0]=a[i][m+1]='#';
for(j=0;j<=m+1;j++)a[0][j]=a[n+1][j]='#';
bfs();
if(flag==0){printf("-1\n");continue;}
build_matrix();
gauss_jordan(id,id);
printf("%.6lf\n",A[0][id]/A[0][0]);
}
return 0;
}