#include<iostream>
#include <iomanip>

using namespace std;
const int INF = 1000000;

double data[100][100];
double dp[100][100][100];
int n,m;

double check(int i,int j,int mm)
{
  if(i==-1)
    {
      double tmp=check(j,0,mm-1);
      for(int xx=1;xx<n;xx++)
	{
	  tmp=max(tmp,check(j,xx,mm-1));
	}
      return tmp;
    }
  else
    {
      if(mm<0)
	return -INF;
      else if(mm==0)
	return data[i][j];
      else if(dp[i][j][mm]!=-1)
	return dp[i][j][mm];
      else
	{
	  double tmp=check(j,0,mm-1)*data[i][j];
	  for(int xx=1;xx<n;xx++)
	    {
	      tmp=max(tmp,check(j,xx,mm-1)*data[i][j]);
	    }
	  dp[i][j][mm]=tmp;
	  return tmp;
	}
    }
}

int main()
{

  for(;cin>>n>>m,n;)
    {
      for(int i=0;i<100;i++)
	for(int j=0;j<100;j++)
	for(int mm=0;mm<100;mm++)
	  {
	    dp[i][j][mm]=-1.0;
	  }
      for(int i=0;i<m;i++)
	for(int j=0;j<m;j++)
	  {
	    double tmp;
	    cin>>tmp;
	    data[i][j]=tmp;
	  }
      double ans=check(-1,0,m-1);
      for(int i=1;i<n;i++)
	{
	  ans=max(ans,check(-1,i,m-1));
	}
      cout<< fixed<<setprecision(2)<< ans << endl;
      
    }
}