#include <bits/stdc++.h>
using namespace std;
int _w;
namespace Claris {
const int MAXN = 50;
int G[MAXN][MAXN], all[MAXN][MAXN], n;
int some[MAXN][MAXN], none[MAXN][MAXN];
int ans;
void dfs(int d, int an, int sn, int nn) {
  if (sn == 0 && nn == 0) {
    ans = max(ans, an);
  }
  int u = sn > 0 ? some[d][0] : none[d][0];
  for (int i = 0; i < sn; ++i) {
    int v = some[d][i];
    if (G[u][v]) continue;
    int tsn = 0, tnn = 0;
    for (int j = 0; j < an; ++j) all[d + 1][j] = all[d][j];
    all[d + 1][an] = v;
    for (int j = 0; j < sn; ++j)
      if (G[v][some[d][j]]) some[d + 1][tsn++] = some[d][j];
    for (int j = 0; j < nn; ++j)
      if (G[v][none[d][j]]) none[d + 1][tnn++] = none[d][j];
    dfs(d + 1, an + 1, tsn, tnn);
    some[d][i] = 0, none[d][nn++] = v;
  }
}
void solve() {
  ans = 0;
  for (int i = 0; i < n; ++i) some[0][i] = i + 1;
  dfs(0, 0, n, 0);
}
}  // namespace Claris
int main() {
  int n;
  double k;
  cin >> n >> k;
  using Claris::G;
  Claris::n = n;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) _w = scanf("%d", &G[i][j]);
  Claris::solve();
  int ans = Claris::ans;
  printf("%.20lf\n", (k / ans) * (k / ans) * ans * (ans - 1) / 2);
  return 0;
}
