#include <bits/stdc++.h>
using namespace std;
long long dp[200][200][200];
long long g[200][200];
int n;
vector<int> edge[200];
long long call(int s, int t, int d) {
  if (d < 0) return 0;
  if (s == t) return d == 0;
  long long &ret = dp[s][t][d];
  if (ret != -1) return ret;
  ret = 0;
  for (__typeof(((int)edge[s].size())) i = 0; i < (((int)edge[s].size()));
       i++) {
    int v = edge[s][i];
    ret += call(v, t, d - 1);
  }
  return ret;
}
int main() {
  ios_base::sync_with_stdio(0);
  int m;
  cin >> n >> m;
  for (__typeof(n) i = 0; i < (n); i++)
    for (__typeof(n) j = 0; j < (n); j++) {
      g[i][j] = 1 << 25;
      g[i][i] = 0;
    }
  for (__typeof(m) i = 0; i < (m); i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    g[u][v] = g[v][u] = 1;
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  for (__typeof(n) k = 0; k < (n); k++)
    for (__typeof(n) i = 0; i < (n); i++)
      for (__typeof(n) j = 0; j < (n); j++)
        if (g[i][j] > g[i][k] + g[k][j]) g[i][j] = g[i][k] + g[k][j];
  memset((dp), (-1), sizeof(dp));
  ;
  double maxi = -1e18;
  long long tot = call(0, n - 1, g[0][n - 1]);
  for (__typeof(n) i = 0; i < (n); i++) {
    long long tot0 = 0;
    for (__typeof(g[0][n - 1] + 1) j = 0; j < (g[0][n - 1] + 1); j++) {
      tot0 += call(0, i, j) * call(i, n - 1, g[0][n - 1] - j);
    }
    if (i > 0 && i < n - 1) tot0 *= 2;
    maxi = max(maxi, double(tot0) / double(tot));
  }
  printf("%.10lf\n", maxi);
  return 0;
}
