#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5 + 10;
int h[N], e[N], ne[N], idx;//和单链表一样,用h[]表示邻接多重表,有向图
int n, m;
int d[N];
void link(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;//将b结点插入到a的链表头下
}
int dfs(int u)//对结点u进行深度遍历
{
queue<int > q;
q.push(u);
d[u] = 0;
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (d[j] == -1)
{
d[j] = d[t] + 1;
q.push(j);
}
}
}
return d[n];
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof(h));
memset(d, -1, sizeof(d));
int a, b;
for (int i = 0; i < m; i++)
{
cin >> a >> b;
link(a, b);//有向图
}
cout << dfs(1);
return 0;
}