#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[150][150],d[150][150],f_min[15][15],maxn,n,used[15][15],flag[15][15];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs_max(int x,int y)
{
if(x==1 && y==n)
{
if(d[x][y]>maxn)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[i][j]=d[i][j];
maxn=d[x][y];
}
return;
}
if(d[x][y]<a[x][y]) return;
for(int i=0;i<4;++i)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx>=1 && ty>=1 && tx<=n && ty<=n && !flag[tx][ty] && !used[tx][ty])
{
used[tx][ty]=1;
d[tx][ty]=d[x][y]+1;
dfs_max(tx,ty);
d[tx][ty]=0;
used[tx][ty]=0;
}
}
}
void dfs_min(int x,int y,int step)
{
if(used[x][y] || x<1 || y<1 || x>n || y>n) return;
if(step>=f_min[x][y]) return;
f_min[x][y]=step;
if(x==1 && y==n) return;
used[x][y]=1;
for(int i=0;i<4;++i)
{
int tx=x+dx[i],ty=y+dy[i];
if(!flag[tx][ty]) dfs_min(tx,ty,step+1);
}
used[x][y]=0;
}
main()
{
int m;
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
flag[x][y]=1;
}
memset(f_min,0x3f,sizeof(f_min));
dfs_min(n,1,1);
memset(used,0,sizeof(used));
d[n][1]=1; used[n][1]=1;
dfs_max(n,1);
cout<<maxn-f_min[1][n];
return 0;
}