#include <bits/stdc++.h>
using namespace std;
int n1[200], n2[200];
double d1[200], d2[200];
int used[200];
int a[200][200];
int main() {
  double tmp, best;
  int i, j, n, m, x, y;
  vector<int> q;
  scanf("%d%d", &n, &m);
  memset(a, 0, sizeof(a));
  for (i = 0; i < m; i++) {
    scanf("%d%d", &x, &y);
    x--;
    y--;
    a[x][y] = 1;
    a[y][x] = 1;
  }
  for (i = 0; i < n; i++) d1[i] = 0;
  q.clear();
  q.push_back(0);
  memset(used, 0, sizeof(used));
  d1[0] = 1;
  used[0] = 1;
  n1[0] = 0;
  for (i = 0; i < q.size(); i++) {
    for (j = 0; j < n; j++)
      if (a[q[i]][j] == 1) {
        if (used[j] == 0) {
          used[j] = 1;
          q.push_back(j);
          n1[j] = n1[q[i]] + 1;
          d1[j] = d1[q[i]];
        } else {
          if (n1[j] == n1[q[i]] + 1) d1[j] += d1[q[i]];
        }
      }
  }
  for (i = 0; i < n; i++) d2[i] = 0;
  q.clear();
  q.push_back(n - 1);
  memset(used, 0, sizeof(used));
  d2[n - 1] = 1;
  used[n - 1] = 1;
  n2[n - 1] = 0;
  for (i = 0; i < q.size(); i++) {
    for (j = 0; j < n; j++)
      if (a[q[i]][j] == 1) {
        if (used[j] == 0) {
          used[j] = 1;
          q.push_back(j);
          n2[j] = n2[q[i]] + 1;
          d2[j] = d2[q[i]];
        } else {
          if (n2[j] == n2[q[i]] + 1) d2[j] += d2[q[i]];
        }
      }
  }
  best = 0;
  for (i = 0; i < n; i++)
    if (n1[i] + n2[i] == n1[n - 1]) {
      tmp = d1[i] * d2[i];
      if ((i != 0) && (i != n - 1)) tmp *= 2;
      if (tmp > best) best = tmp;
    }
  best /= d1[n - 1];
  printf("%.9lf\n", best);
}
