#include<bits/stdc++.h>
using namespace std;
int m,n,X,Y,FX,FY;
#define M 100000
long long way[40][40],f[40][40],s[40][40],lian[40][40];
int d1[9]={-100,1,1,-1,-1,2,2,-2,-2};
int d2[9]={-233,2,-2,2,-2,1,-1,1,-1};
long long First[M],Next[M],to[M],w[M],tot,ji[40][40],a[40][40];
inline void add(int x,int y,int z)
{
tot++;
Next[tot]=First[x];
First[x]=tot;
to[tot]=y;
w[tot]=z;
}
map<int,int> XX;
map<int,int> YY;
queue<int> d;
void spfa()
{
while(!d.empty())
{
int x=d.front();
d.pop();
int xx1=XX[x],yy1=YY[x];
f[xx1][yy1]=0;
for(int i=First[x];i;i=Next[i])
{
int lmh=to[i];
int xx2=XX[lmh],yy2=YY[lmh];
if(lian[xx2][yy2]>lian[xx1][yy1]+w[i])
{
lian[xx2][yy2]=lian[xx1][yy1]+w[i];
way[xx2][yy2]=way[xx1][yy1];
if(!f[xx2][yy2])
{
f[xx2][yy2]=1;
d.push(lmh);
}
continue;
}
if(lian[xx2][yy2]==lian[xx1][yy1]+w[i])
{
way[xx2][yy2]+=way[xx1][yy1];
if(!f[xx2][yy2])
{
f[xx2][yy2]=1;
d.push(lmh);
}
}
}
}
}
int v[40][40];
inline void dfs(int CNT,int x,int y)
{
if((a[x][y]==0||a[x][y]==4||a[x][y]==3)&&CNT!=ji[x][y])
{
add(CNT,ji[x][y],1);
return;
}
for(int df=1;df<=8;df++)
{
if(x+d1[df]>=1&&x+d1[df]<=n&&y+d2[df]>=1&&y+d2[df]<=m&&v[x+d1[df]][y+d2[df]]==0)
{
v[x+d1[df]][y+d2[df]]=1;
if(a[x+d1[df]][y+d2[df]]==2)continue;
dfs(CNT,x+d1[df],y+d2[df]);
v[x+d1[df]][y+d2[df]]=0;
}
}
}
int main()
{
cin>>n>>m;
int cnt=0,cntt=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cntt++;
XX[cntt]=i;
YY[cntt]=j;
ji[i][j]=cntt;
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cnt++;
//
// if(a[i][j]==1||a[i][j]==4||a[i][j]==3)
// {
if(a[i][j]==3)
{
X=i,Y=j;
}
if(a[i][j]==4)FX=i,FY=j;
memset(v,0,sizeof(v));
v[i][j]=1;
dfs(cnt,i,j);
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
lian[i][j]=s[i][j]=21474836;
way[X][Y]=1;
s[X][Y]=0;
lian[X][Y]=0;
d.push(ji[X][Y]);
spfa();
// for(int i=1;i<=n;i++){
//
// for(int j=1;j<=m;j++)
// {
// cout<<way[i][j]<<" ";
// }
//
// cout<<endl;}
if(way[FX][FY])
{
cout<<lian[FX][FY]-1<<endl<<way[FX][FY];
return 0;
}
cout<<-1;
}