#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fll;
const int MAX = 100;
vector<int> g[MAX];
int vis[MAX], d[MAX];
int solve(set<int>& m) {
  int ans = 0;
  for (int x : m) vis[x] = 0;
  for (int x : m)
    if (!vis[x]) {
      set<int> comp;
      function<void(int)> dfs = [&](int i) {
        comp.insert(i), vis[i] = 1;
        for (int j : g[i])
          if (!vis[j] and m.count(j)) dfs(j);
      };
      dfs(x);
      int ma, deg = -1, cyc = 1;
      for (int i : comp) {
        if (d[i] <= 1) cyc = 0;
        if (d[i] > deg) deg = d[i], ma = i;
      }
      if (deg <= 2) {
        ans += (comp.size() + cyc) / 2;
        continue;
      }
      vector<int> tmp;
      auto menos = [&](int k) {
        if (comp.count(k)) tmp.push_back(k), d[k]--;
      };
      comp.erase(ma);
      for (int i : g[ma]) menos(i);
      int at = 1 + solve(comp);
      for (int i : g[ma]) {
        auto it = comp.find(i);
        if (it == comp.end()) continue;
        for (int j : g[i]) menos(j);
        comp.erase(it);
      }
      ans += min(at, deg + solve(comp));
      for (int i : tmp) d[i]++;
    }
  return ans;
}
int solve(int n) {
  set<int> m;
  for (int i = 0; i < n; i++) m.insert(i), d[i] = g[i].size();
  return solve(m);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, 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 - solve(n);
  cout << fixed << setprecision(12) << (1 - (1 / (double)ans)) * k * k / 2
       << '\n';
  exit(0);
}
