#include <bits/stdc++.h>
using namespace std;
int n, m;
int g[405][405];
vector<int> v[405];
double ans;
double gai[405];
double pos[405];
double suan(int yi, int juli) {
  memset(gai, 0, sizeof(gai));
  for (int i = 1; i <= n; i++) {
    if (g[i][yi] == juli) {
      for (int j = 0; j < (int)v[i].size(); j++) {
        gai[v[i][j]] += 1.0 / n / (int)v[i].size();
      }
    }
  }
  vector<int> r;
  r.clear();
  for (int i = 1; i <= n; i++)
    if (gai[i]) r.push_back(i);
  double ret = 0;
  for (int i = 1; i <= n; i++) {
    double tmp = 0;
    for (int j = 0; j < (int)r.size(); j++) {
      pos[g[i][r[j]]] = max(pos[g[i][r[j]]], gai[r[j]]);
    }
    for (int j = 0; j < (int)r.size(); j++) {
      tmp += pos[g[i][r[j]]];
      pos[g[i][r[j]]] = 0;
    }
    ret = max(ret, tmp);
  }
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++)
      if (i != j) g[i][j] = 199912310;
  }
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    scanf("%d%d", &x, &y);
    g[x][y] = 1;
    g[y][x] = 1;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  for (int k = 1; k <= n; k++) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++)
        g[i][j] = g[j][i] = min(g[i][j], g[i][k] + g[k][j]);
    }
  }
  for (int i = 1; i <= n; i++) {
    double now = 0;
    for (int dist = 0; dist < n; dist++) {
      int cnt = 0;
      for (int j = 1; j <= n; j++) {
        if (g[i][j] == dist) cnt++;
      }
      if (!cnt) continue;
      double p = 1.0 / n;
      double q = suan(i, dist);
      now += max(p, q);
    }
    ans = max(ans, now);
  }
  printf("%.8lf\n", ans);
  return 0;
}
