#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fll;
const int MAX = 128;
vector<int> g[MAX];
bitset<MAX> bs[MAX];
int n;
int vis[MAX];
int solve(bitset<MAX> m) {
  int ans = 0;
  for (int x = 0; x < n; x++)
    if (m[x]) {
      bitset<MAX> comp;
      function<void(int)> dfs = [&](int i) {
        comp[i] = 1, m[i] = 0;
        for (int j : g[i])
          if (m[j]) dfs(j);
      };
      dfs(x);
      int ma, deg = -1, cyc = 1;
      for (int i = 0; i < n; i++)
        if (comp[i]) {
          int d = (bs[i] & comp).count();
          if (d <= 1) cyc = 0;
          if (d > deg) deg = d, ma = i;
        }
      if (deg <= 2) {
        ans += (comp.count() + cyc) / 2;
        continue;
      }
      comp[ma] = 0;
      int at = 1 + solve(comp);
      for (int i : g[ma]) comp[i] = 0;
      ans += min(at, deg + solve(comp));
    }
  return ans;
}
int cover() {
  bitset<MAX> m;
  for (int i = 0; i < n; i++) {
    m[i] = 1;
    for (int j : g[i]) bs[i][j] = 1;
  }
  return solve(m);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int k;
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      int x;
      cin >> x;
      if (!x and (i != j)) g[i].push_back(j);
    }
  }
  int ans = n - cover();
  cout << fixed << setprecision(12) << (1 - (1 / (double)ans)) * k * k / 2
       << '\n';
  exit(0);
}
