//Autor Simoiu Robert 100 pct.
#include <fstream>
using namespace std;

#define MAX 1000000
#define M 105
#define N 105
long long n,m,i,j,k,l,q1=1,ct[M][N]; //q1 este contorul cu care numaram elementele cozii
bool stop;
ifstream f("lab.in");
ofstream g("lab.out");
struct vector
{
    int st,dr;
} q[MAX]; //coada noastra, ca vectori de structuri
void citire()
{
    f>>m>>n;
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
        {
            f>>ct[i][j];
            if (ct[i][j]==-1) //punem punctul initial in coada
            {
                q[0].st=i;
                q[0].dr=j;
            }
        }
}
inline void dreapta()
{
    q[q1].st=i; //punem in coada ce am gasit
    q[q1].dr=j+1;
    ct[i][j+1]=k+1; //marcam matricea cu numar consecutiv
    q1++;
    if (j+1==n) stop=1; //verificam daca am ajuns la iesire
}
inline void stanga()
{
    q[q1].st=i; //punem in coada ce am gasit
    q[q1].dr=j-1;
    ct[i][j-1]=k+1; //marcam matricea cu numar consecutiv
    q1++;
    if (j-1==1) stop=1; //verificam daca am ajuns la iesire
}
inline void sus()
{
    q[q1].st=i-1; //punem in coada ce am gasit
    q[q1].dr=j;
    ct[i-1][j]=k+1; //marcam matricea cu numar consecutiv
    q1++;
    if (i-1==1) stop=1; //verificam daca am ajuns la iesire
}
inline void jos()
{
    q[q1].st=i+1; //punem in coada ce am gasit
    q[q1].dr=j;
    ct[i+1][j]=k+1; //marcam matricea cu numar consecutiv
    q1++;
    if (i+1==m) stop=1; //verificam daca am ajuns la iesire
}
inline void verf() //verificam directiile posibile
{
    if ((ct[i][j+1]==0) && !(j==n))
        dreapta();

    if ((ct[i][j-1]==0) && !(j==1))
        stanga();

    if ((ct[i-1][j]==0) && !(i==1))
        sus();

    if ((ct[i+1][j]==0) && !(i==m))
        jos();
}
void solve()
{
    for (l=0;!stop;l++) //parcurgem coada
    {
        i=q[l].st; //initalizam doua variabile cu elementele cozii
        j=q[l].dr; //ca sa ne fie mai usor pe parcursul algoritmului
        if ((i==0)&&(j==0)) {stop=1;k=-1;} //verifica daca nu exista solutie, dandu-i lui k valoarea -1
        else {verf();

        if (!((ct[q[l].st][q[l].dr]==ct[q[l+1].st][q[l+1].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+2].st][q[l+2].dr]) //verificam in coada numerele pe care le-am marcat anterior, iar daca
                || (ct[q[l].st][q[l].dr]==ct[q[l+3].st][q[l+3].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+4].st][q[l+4].dr]))|| (stop)) // nu mai gasim o coada cu acelasi numar marim pe k,
            k++;} //adica cel care marcheaza matricea, "drumul de lungime minima"
    }
}
void scriere()
{
    g<<k<<"\n";//afisam drumul de lungime minima
}
int main()
{
    citire();
    solve();
    scriere();
    return 0;
}
/* Made genuine by Simoiu Robert */



