#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,d[33][33],sx,sy,ex,ey;
int x[8]={1,1,-1,-1,2,2,-2,-2},y[8]={2,-2,2,-2,1,-1,1,-1};
int sum[33][33],dis[33][33],vis[33][33];
ll val[33][33];
queue<pair<int,int> > q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&d[i][j]);
if(d[i][j]==3){
sx=i,sy=j;
d[i][j]=1;
}
if(d[i][j]==4){
ex=i,ey=j;
d[i][j]=1;
}
}
}
memset(sum,0x3f3f3f,sizeof(sum));
sum[sx][sy]=0;
memset(dis,0x3f3f3f,sizeof(dis));
dis[sx][sy]=0;
val[sx][sy]=1;
q.push(make_pair(sx,sy));
while(!q.empty()){
int kx=q.front().first,ky=q.front().second;
q.pop();
if(vis[kx][ky]) continue;
vis[kx][ky]=1;
if(d[kx][ky]==2) continue;
for(int i=0;i<8;i++){
int nx=kx+x[i],ny=ky+y[i];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(d[nx][ny]==2) continue;
if(sum[nx][ny]>sum[kx][ky]+(1-d[nx][ny])){
sum[nx][ny]=sum[kx][ky]+(1-d[nx][ny]);
dis[nx][ny]=dis[kx][ky]+1;
val[nx][ny]=val[kx][ky];
}
else if(sum[nx][ny]==sum[kx][ky]+(1-d[nx][ny])){
if(dis[nx][ny]>dis[kx][ky]+1){
dis[nx][ny]=dis[kx][ky]+1;
val[nx][ny]=val[kx][ky];
}
else if(dis[nx][ny]==dis[kx][ky]+1){
val[nx][ny]+=val[kx][ky];
}
}
q.push(make_pair(nx,ny));
}
}
if(sum[ex][ey]>1e9){
printf("-1");
return 0;
}
printf("%d\n%d\n%lld",sum[ex][ey],dis[ex][ey],val[ex][ey]);
}