#include <bits/stdc++.h>
#pragma comment(linker, "/stack:16777216")
using namespace std;
const int INF = 1000000000;
const int BASE = 1000000007;
const int MAX = 507;
const int MAX2 = 10007;
const int MAXE = 100000;
const int ADD = 1000000;
const int MOD = 1000000007;
const int CNT = 0;
int d[MAX][MAX];
vector<pair<int, int> > C[MAX];
double p2[MAX];
int deg[MAX];
pair<int, double> A[MAX];
int To[MAX];
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = (0); i < (n); i++) {
    for (int j = (0); j < (n); j++) {
      d[i][j] = INF;
    }
    d[i][i] = 0;
  }
  for (int i = (0); i < (m); i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    --a;
    --b;
    d[a][b] = d[b][a] = 1;
    deg[a]++;
    deg[b]++;
  }
  for (int k = (0); k < (n); k++) {
    for (int i = (0); i < (n); i++) {
      for (int j = (0); j < (n); j++) {
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
  for (int i = (0); i < (n); i++) {
    for (int j = (0); j < (n); j++) {
      C[i].push_back(make_pair(d[i][j], j));
    }
    sort(C[i].begin(), C[i].end());
  }
  double res = 0;
  for (int i = (0); i < (n); i++) {
    int ptr = 0;
    double P = 0;
    while (ptr < n) {
      int add = 1;
      while (ptr + add < n && C[i][ptr + add].first == C[i][ptr].first) ++add;
      double pp = 1.0 / n;
      memset(p2, 0, sizeof(p2));
      for (int j = (ptr); j < (ptr + add); j++) {
        int v = C[i][j].second;
        for (int k = (0); k < (n); k++) {
          if (d[v][k] == 1) {
            p2[k] += 1.0 / n / deg[v];
          }
        }
      }
      int szTo = 0;
      double sum = 0;
      for (int j = (0); j < (n); j++) {
        if (p2[j] > 1e-6) {
          To[szTo++] = (j);
          sum += p2[j];
        }
      }
      for (int j = (0); j < (n); j++) {
        int szA = 0;
        double cur = 0;
        for (int k = (0); k < (szTo); k++) {
          int to = To[k];
          A[szA++] = (make_pair(d[j][to], p2[to]));
        }
        sort(A, A + szA);
        int ptr2 = 0;
        while (ptr2 < szA) {
          int add2 = 1;
          while (ptr2 + add2 < szA && A[ptr2].first == A[ptr2 + add2].first)
            ++add2;
          cur += A[ptr2 + add2 - 1].second;
          ptr2 += add2;
        }
        pp = max(pp, cur);
      }
      P += pp;
      ptr += add;
    }
    res = max(res, P);
  }
  printf("%.10f\n", res);
  return 0;
}
