import java.util.*;
//java中的Math.abs()可以用于浮点数取绝对值
//String.format("%.2f",x) %.2f"为保留两位小数,x为要输出的数字
class Main{
static int N=110;
static double[][] a=new double[N][N];
static int n=0;
static double eps=0.000001;
public static int guass(double[][] a){
int row,col;
//遍历每一列
for(row=0,col=0;col<n;col++){
int t=row;
//找一列中的最大值
for(int i=row;i<n;i++){
if(Math.abs(a[i][col])>Math.abs(a[t][col])){
t=i;
}
}
//如果找出的最大值为0,继续下一列寻找非0的最大值
if(Math.abs(a[t][col])<eps)continue;
//交换
for(int i=col;i<=n;i++){
double temp=a[t][i];
a[t][i]=a[row][i];
a[row][i]=temp;
}
//将当前的非0第一位数置为1,构造阶梯矩阵的斜边
//这里要注意从后往前去更新数据,因为这里变化是根据第一个数变化的,要保持它的数据最后变化或者找个数存一下
for(int i=n;i>=col;i--){
a[row][i]/=a[row][col];
}
//下面一步就是用上面那一行来更新下面的所有行,同样要注意从后往前更新数据
//注意只需要对首位非0的行进行更新就行
for(int i=row+1;i<n;i++){
if(Math.abs(a[i][col])>eps) {
for(int j=n;j>=col;j--){
a[i][j]-=a[row][j]*a[i][col];
}
}
}
//进行下一行的处理
row++;
}
//0解或者无穷解
if(row<n){
//阶梯状,更新不了下面的说明往下的都是0;判断下面每一行的最后结果,如果不是0,说明无解
for(int i=row;i<n;i++){
if(Math.abs(a[i][n])>eps)return 2;
}
return 1;
}
//处理唯一解,从下往上得出解
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
a[i][n]-=a[j][n]*a[i][j];//a[j][n]这里的横坐标为j是因为需要从这一行往下清空干净,可以举个3*4的例子
}
}
//唯一解
return 0;
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for(int i=0;i<n;i++){
for(int j=0;j<=n;j++){
a[i][j]=sc.nextDouble();
}
}
int t=guass(a);
if(t==0){
for(int i=0;i<n;i++){
if(Math.abs(a[i][n]) < eps){
System.out.printf("%.2f\n",Math.abs(a[i][n]));
}else{
System.out.println(String.format("%.2f",a[i][n]));
}
}
}
else if(t==1){
System.out.println("Infinite group solutions");
}else{
System.out.println("No solution");
}
}
}