#include <iostream>#include<cstring>#include<cstdio>#include<algorithm>#define MAX(x,y) (x>y?x:y)#define MIN(x,y) (x<y?x:y)using namespace std;struct info{int x,y,id;}h[1000100];struct node{int x,y,tw;}step[200],pre,now;int n,m,dp[50][50][200],tot,cas;int x1,y1,x2,y2,x3,y3,c[4]={-1,0,1,0},d[4]={0,-1,0,1};int vis[50][50][200],ap[50][50][200],mod=1000000;char map[50][50];void getnx(){int i;tot=0;for(i=0;i<4;i++){int k=(i+2)%4;pre.x=x3,pre.y=y3,pre.tw=i;now.x=x3+c[i];now.y=y3+d[i];now.tw=i;if(!(now.x>=0&&now.x<n&&now.y>=0&&now.y<m)) continue;while(now.x>=0&&now.x<n&&now.y>=0&&now.y<m){step[tot].x=pre.x;step[tot].y=pre.y;step[tot].tw=pre.tw;tot++;pre=now;if(now.x+c[i]>=0&&now.x+c[i]<n&&now.y+d[i]>=0&&now.y+d[i]<m){now.x+=c[i];now.y+=d[i];now.tw=i;}else{pre.tw=k;now.x+=c[k];now.y+=d[k];now.tw=k;break;}}while(now.x!=x3||now.y!=y3){step[tot].x=pre.x;step[tot].y=pre.y;step[tot].tw=pre.tw;tot++;pre=now;now.x+=c[k];now.y+=d[k];now.tw=k;}step[tot].x=pre.x;step[tot].y=pre.y;step[tot].tw=pre.tw;tot++;}if(!tot){tot=1;step[0].x=x3;step[0].y=y3;step[0].tw=0;}}bool check(int ax,int ay,int bx,int by){if(ax!=bx&&ay!=by) return true;int i,l,r;if(ax==bx){l=MIN(ay,by)+1;r=MAX(ay,by)-1;for(i=l;i<=r;i++)if(map[ax][i]=='J')return true;return false;}elseif(ay==by){l=MIN(ax,bx)+1;r=MAX(ax,bx)-1;for(i=l;i<=r;i++)if(map[i][ay]=='J')return true;return false;}return false;}void search(){int head=0,tail=1,i,x,y,z,xx,yy,zz,nowx,nowy;memset(dp,10,sizeof(dp));ap[x1][y1][0]=cas;dp[x1][y1][0]=0;h[1].x=x1; h[1].y=y1; h[1].id=0;do{head++;if(head==mod) head=1;x=h[head].x;y=h[head].y;z=h[head].id;if(x==x2&&y==y2) return;zz=(z+1)%tot;vis[x][y][z]=cas-1;for(i=0;i<4;i++){xx=x+c[i];yy=y+d[i];if(xx>=0&&xx<n&&yy>=0&&yy<m){if(map[xx][yy]=='.'&&(check(xx,yy,step[zz].x,step[zz].y)||xx==x2&&yy==y2&&!(xx==step[z].x&&yy==step[z].y)))if(ap[xx][yy][zz]!=cas||dp[xx][yy][zz]>dp[x][y][z]+1){dp[xx][yy][zz]=dp[x][y][z]+1;ap[xx][yy][zz]=cas;if(vis[xx][yy][zz]!=cas){vis[xx][yy][zz]=cas;tail++;if(tail==mod) tail=1;h[tail].x=xx;h[tail].y=yy;h[tail].id=zz;}}if(map[xx][yy]=='J'){nowx=xx; nowy=yy;while(nowx>=0&&nowx<n&&nowy>=0&&nowy<m){if(map[nowx][nowy]=='.'&&map[nowx-c[i]][nowy-d[i]]=='J'){xx=nowx;yy=nowy;if((check(xx,yy,step[zz].x,step[zz].y)||xx==x2&&yy==y2&&!(xx==step[z].x&&yy==step[z].y)))if(ap[xx][yy][zz]!=cas||dp[xx][yy][zz]>dp[x][y][z]+1){dp[xx][yy][zz]=dp[x][y][z]+1;ap[xx][yy][zz]=cas;if(vis[xx][yy][zz]!=cas){vis[xx][yy][zz]=cas;tail++;if(tail==mod) tail=1;h[tail].x=xx;h[tail].y=yy;h[tail].id=zz;}}}nowx+=c[i]; nowy+=d[i];}}}}}while(head!=tail);}int main(){int i,j;cas=0;while(scanf("%d%d",&n,&m)!=EOF){cas++;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);for(i=0;i<n;i++){scanf(" %s",map[i]);for(j=0;j<m;j++)if(map[i][j]=='P'){x3=i; y3=j;map[i][j]='.';}}getnx();search();int ans=-1;for(i=0;i<tot;i++)if(ap[x2][y2][i]==cas)if(dp[x2][y2][i]<ans||ans==-1)ans=dp[x2][y2][i];if(ans<0) printf("Today we have no lunch!n");else printf("%dn",ans);}}


