#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int best;
int m, n;
int num[MAXN];
int path[MAXN];
int g[MAXN][MAXN];
bool dfs(int *adj, int total, int cnt) {
  int i, j, k;
  int t[MAXN];
  if (total == 0) {
    if (best < cnt) {
      best = cnt;
      return true;
    }
    return false;
  }
  for (i = 0; i < total; i++) {
    if (cnt + (total - i) <= best) return false;
    if (cnt + num[adj[i]] <= best) return false;
    for (k = 0, j = i + 1; j < total; j++)
      if (g[adj[i]][adj[j]]) t[k++] = adj[j];
    if (dfs(t, k, cnt + 1)) return true;
  }
  return false;
}
int MaximumClique() {
  int i, j, k;
  int adj[MAXN];
  if (n <= 0) return 0;
  best = 0;
  for (i = n - 1; i >= 0; i--) {
    for (k = 0, j = i + 1; j < n; j++)
      if (g[i][j]) adj[k++] = j;
    dfs(adj, k, 1);
    num[i] = best;
  }
  return best;
}
int main() {
  int K;
  cin >> n >> K;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> g[i][j];
    }
  }
  int res = MaximumClique();
  printf("%.10f\n", (double)K * K * (res - 1) / res / 2);
}
