using static IO;
public class IO{
public static IO Cin=new();
public static StreamReader reader=new(Console.OpenStandardInput());
public static StreamWriter writer=new(Console.OpenStandardOutput());
public static implicit operator string(IO _)=>reader.ReadLine();
public static implicit operator char[](IO _)=>reader.ReadLine().ToArray();
public static implicit operator int(IO _)=>int.Parse(reader.ReadLine());
public static implicit operator double(IO _)=>double.Parse(reader.ReadLine());
public static implicit operator string[](IO _)=>reader.ReadLine().Split();
public static implicit operator int[](IO _)=>Array.ConvertAll(reader.ReadLine().Split(),int.Parse);
public static implicit operator (int,int)(IO _){int[] a=Cin;return(a[0],a[1]);}
public static implicit operator (int,int,int)(IO _){int[] a=Cin;return(a[0],a[1],a[2]);}
public void Deconstruct(out int a,out int b){(int,int) r=Cin;(a,b)=r;}
public void Deconstruct(out int a,out int b,out int c){(int,int,int) r=Cin;(a,b,c)=r;}
public static void Loop(int end,Action<int> action,int start = 0,in int add = 1){for(;start<end;start+=add)action(start);}
public static void Loop(int end,Func<int,bool> action,int start = 0,in int add = 1){for(;start<end && action(start) ; start+=add);}
public static object? Cout{set{writer.Write(value);}}
public static object? Coutln{set{writer.WriteLine(value);}}
public static void Main() {checked{Program.Coding();}writer.Flush();}
}
class Program
{
public static void Coding()
{
(int nodeCount, int lineCount) = Cin;
Graph graph = new(nodeCount);
Loop(lineCount, _ =>
{
(int a, int b) = Cin;
graph.AddTwoWay(--a, --b);
});
int[] dist2zero = graph.GetDistance(0);
#if DEBUG
foreach (var r in Enumerable.Range(0, nodeCount).Select(i => $"dist2zero[{i}] : {dist2zero[i]}")) Coutln = r;
#endif
Queue<int> queue = new();
bool[] visited = new bool[nodeCount];
visited[nodeCount - 1] = true;
foreach (int next in graph.Lines[nodeCount - 1])
{
if (next == 0)
{
Cout = 1;
return;
}
visited[next] = true;
if (dist2zero[next] > dist2zero[^1] - 1) continue;
queue.Enqueue(next);
}
HashSet<int> shortable = new();
for (int d = dist2zero[^1]-2; visited[0] is false; d--)
{
#if DEBUG
Coutln = $"queue: {string.Join(' ', queue)}";
#endif
int remain = queue.Count;
if (remain == 1)
{
Cout = queue.Dequeue() + 1;
return;
}
for (; remain > 0; remain--)
{
int from = queue.Dequeue();
foreach (int to in graph.Lines[from])
{
if (to == 0)
{
shortable.Add(from);
}
if (visited[to]) continue;
visited[to] = true;
if (dist2zero[to] > d) continue;
queue.Enqueue(to);
}
}
}
Cout = shortable.Count == 1 ? (shortable.First() + 1) : 1;
}
}
class Graph
{
public Graph(int size)
{
Lines = new LinkedList<int>[NodeCount = size];
for (int i = 0; i < size; i++) Lines[i] = new();
}
public void AddTwoWay(int a, int b)
{
Lines[a].AddLast(b);
Lines[b].AddLast(a);
}
public int[] GetDistance(int starting)
{
Queue<int> queue = new();
queue.Enqueue(starting);
int[] dist = Enumerable.Repeat(int.MaxValue, NodeCount).ToArray();
for (int distance = 0; queue.Count > 0; distance++)
{
for (int remain = queue.Count; remain > 0; remain--)
{
int from = queue.Dequeue();
if (dist[from] != int.MaxValue) continue;
dist[from] = distance;
foreach (int to in Lines[from])
{
queue.Enqueue(to);
}
}
}
return dist;
}
public int NodeCount { get; }
public LinkedList<int>[] Lines { get; }
}