/*
TASK:trade
LANG:C++
*/
#include <iostream>
#include <cstdio>
using namespace std;

long A[1000][1000];
double price [1000];
int calced [1000];
int N;

int is_merc (int i)
{
  for (int p = 0; p < N; p++)
    if (A[i][p])
      return 0;
  return 1;
}

int cbc (int i)
{
  for (int p = 0; p <= N; p++)
    if (A[p][i])
      if (!calced[p]) return 0;
  return 1;
}

int all_are_calced ()
{
  for (int p = 0; p <= N; p++)
    if (!calced[p]) return 0;
  return 1;
}

double total_inp (int i)
{
  double tot = 0;
  for (int p = 0; p <= N; p++)
  {
    if (A[p][i])
        tot += price[p];
  }
  return tot;
}

double inp (int i)
{
  int br = 0;
  for (int p = 0; p <= N; p++)
    if (A[p][i]) br ++;
  return br;
}

double outp (int i)
{
  int br = 0;
  for (int p = 0; p <= N; p++)
    if (A[i][p]) br ++;
  return br;
}

int main ()
{
   int M, i, j, p, q, first = 1;
   double min;
   cin >> N >> M;
   for (p = 0; p < M; p++)
   {
     cin >> i >> j;
     A[i][j] = 1;
   }
   for (p = 0; p <= N; p++)
   {
     price [p] = 0;
     calced [p] = 0;
   }
   price[0] = 1;
   calced[0] = 1;
   while (!all_are_calced())
     for (q = 1; q <= N; q++)
       if (cbc(q) && !calced[q])
       {
         if (!is_merc(q))
         {
           price[q] = total_inp(q) / inp(q);
           price[q] += 1 / outp(q);
         }
         else
           price[q] = total_inp(q) / inp(q);
         calced[q] = 1;
       }

   for (p = 1; p <= N; p++)
     if (is_merc(p))
     {
       if (first)
       {
         min = price[p];
         first = 0;
       }
       if (price[p] < min) min = price[p];
     }
  printf ("%.6lf\n", min);
}

