#include <stdio.h>
#include <string.h>
#include <algorithm>
#define INF 1 << 29
using namespace std;
int map1[410][410],map2[410][410]; //记录火车的路和大巴的路
int n,m;
void dijkstra(int map[][410])
{
int res[410]; //记录结果
int vis[410]; //访问标记
int v,min; //每相连点的最小下标和最短的路
for(int i = 1 ; i <= n ; i++ ) //初始化
{
vis[i] = 0;
res[i] = map[1][i];
}
for (int i = 1 ; i <= n ; i++ )
{
min = 1<< 29;
for (int j = 1 ; j <= n ; j++ )
{
if (vis[j] == 0 && res[j] < min ) //遍历,找出与这个点相连的最小路
{
v = j;
min = res[j];
}
}
vis[v] = 1;
for (int j = 1 ; j <= n ; j++ )
{
if(vis[j] == 0 && res[j] > map[v][j] + res[v]) //判断
{
res[j] = map[v][j] +res[v];
}
}
}
if (res[n] == INF) //如果最后的值没有改变 说明不可能
{
printf("-1\n");
return ;
}
else
printf("%d\n",res[n]);
}
int main()
{
while (~scanf("%d%d",&n,&m ) )
{
for (int i = 1 ; i <= n ; i++ ) //初始化
{
for (int j = 1 ; j <= n ; j++ )
{
if ( i == j)
{
map1[i][j] = 0;
map1[i][j] = 0;
}
else
{
map1[i][j] = map1[j][i] = INF;
map2[i][j] = map2[j][i] = INF;
}
}
}
int flag = 0;
for (int i = 0 ; i < m ; i++ )
{
int a,b;
scanf("%d%d",&a,&b);
if ( (a == 1 && b == n) || (a == n && b == 1) ) //必有一条路可以直达,所以判断是火车还是巴士
{
flag = 1;
}
map1[a][b] = 1;
map1[b][a] = 1;
}
for (int i = 1 ; i <= n ; i ++ )
{
for (int j = 1 ; j <= n ; j++ )
{
if ( map1[i][j] == INF || map1[i][j] == 0)
{
map2[i][j] = 1;
map2[j][i] = 1;
}
}
}
if (m == n*(n-1)/2) //如果只有火车有路径
{
printf("-1\n");
continue;
}
if (flag == 1) //如果火车可以直达
{
dijkstra(map2);
}
else if (flag == 0) //如果大巴可以直达
{
dijkstra(map1);
}
}
return 0;
}