import java.util.Scanner;
import java.lang.Math;
public class Factorial {
public static void main(String[] arg) {
//запись матрицы
Scanner in = new Scanner(System.in);
int n, i, j, k, error=0,g=0;
int[] m = new int[2];
int[] mult = new int[2];
int[] ded = new int[2];
n = in.nextInt();
int[][] chis = new int[n][n + 1];
int[][] znam = new int[n][n + 1];
for (i = 0; i < n; i++) {
for (j = 0; j < n + 1; j++) {
chis[i][j] = in.nextInt();
znam[i][j] = 1;
//System.out.print(chis[i][j]+"/"+znam[i][j]+" ");
}
//System.out.println();
}
//прямой ход Гаусса
for (k = 1; k < n; k++) {
//правильная расстановка строк
if (chis[k - 1][k - 1] == 0)
for (i = k; i < n; i++) {
if (chis[i][k - 1] != 0)
for (j = 0; j <= n; j++) {
m[0] = chis[k - 1][j];
m[1] = znam[k - 1][j];
chis[k - 1][j] = chis[i][j];
znam[k - 1][j] = znam[i][j];
chis[i][j] = m[0];
znam[i][j] = m[1];
}
}
if(chis[k-1][k-1]==0)
error=1;
for (j = k; j < n; j++) {
m = div(chis[j][k - 1], znam[j][k - 1], chis[k - 1][k - 1], znam[k - 1][k - 1]); //a[j][k - 1] / a[k - 1][k - 1];
if(m[0]==0)
m[1]=1;
for (i = 0; i <= n; i++) {
mult = mult(m[0], m[1], chis[k - 1][i], znam[k - 1][i]); //a[j][i] = a[j][i] - m * a[k - 1][i];
ded = ded(chis[j][i], znam[j][i], mult[0], mult[1]);
chis[j][i] = ded[0];
znam[j][i] = ded[1];
}
}
}
if (chis[n-1][n-1] == 0)
for (i = n-1; i > 0; i--) {
if (chis[i][n-1] != 0)
for (j = 0; j <= n; j++) {
m[0] = chis[n-1][j];
m[1] = znam[n-1][j];
chis[n-1][j] = chis[i][j];
znam[n-1][j] = znam[i][j];
chis[i][j] = m[0];
znam[i][j] = m[1];
}
}
if(chis[n-1][n-1]==0)
error=1;
//обратный ход
for (k = n - 1; k > 0; k--) {
for (j = k; j > 0; j--) {
//System.out.println("a["+(j-1)+"]"+""+"["+k+"]"+"/"+"a["+k+"]"+"["+k+"]"); //что на что делится строчкой ниже
m = div(chis[j - 1][k], znam[j - 1][k], chis[k][k], znam[k][k]);
if(m[0]==0)
m[1]=1;
for (i = n; i >= k; i--) {
//System.out.println(" "+k+" "+i);
mult = mult(m[0], m[1], chis[k][i], znam[k][i]);
//System.out.println("j-1="+(j-1)+"i="+i);
ded = ded(chis[j - 1][i], znam[j - 1][i], mult[0], mult[1]);
chis[j - 1][i] = ded[0];
znam[j - 1][i] = ded[1];
}
}
}
for(i=0;i<n;i++) {
if (n == 2)
if (chis[i][0] == 0 && chis[i][1] == 0)
error = 1;
if (n == 3)
if (chis[i][0] == 0 && chis[i][1] == 0 && chis[i][2] == 0)
error = 1;
if (n == 4)
if (chis[i][0] == 0 && chis[i][1] == 0 && chis[i][2] == 0 && chis[i][3] == 0)
error = 1;
if (n == 5)
if (chis[i][0] == 0 && chis[i][1] == 0 && chis[i][2] == 0 && chis[i][3] == 0 && chis[i][4] == 0)
error = 1;
}
if(error==1)
{
System.out.println("No solution");
}
else
for (i = 0; i < n; i++) {
m = div(chis[i][n], znam[i][n], chis[i][i], znam[i][i]);
if (m[0] < 0 & m[1] < 0) {
m[0] = Math.abs(m[0]);
m[1] = Math.abs(m[1]);
}
if(m[0]==0) {
m[1] = Math.abs(m[1]);
if (m[1] == 0)
m[1] = 1;
}
g=gcd(Math.abs(m[0]),Math.abs(m[1]));
m[0]=m[0]/g;
m[1]=m[1]/g;
if(m[0]>0 && m[1] < 0){
m[0]=-m[0];
m[1]=Math.abs(m[1]);
}
System.out.println(m[0]+"/"+m[1]);
}
}
//умножение двух рациональных
public static int[] mult(int chis1,int znam1,int chis2,int znam2)
{
int [] a=new int[2];
int[] b=new int[2];
b[0]=90904040;
b[1]=90904040;
a[0]=chis1*chis2;
a[1]=znam1*znam2;
int g=gcd(Math.abs(a[0]),Math.abs(a[1]));
if(g==90904040)
return b;
a[0]=a[0]/g;
a[1]=a[1]/g;
return a;
}
//деление двух рациональных
public static int[] div(int chis1,int znam1,int chis2,int znam2)
{
int[] a=new int[2];
a[0]=chis1*znam2;
a[1]=znam1*chis2;
return a;
}
//вычитание 2-ух рац чисел
public static int[] ded(int chis1,int znam1,int chis2,int znam2)
{
int[] a=new int[2];
a[0]=chis1*znam2-chis2*znam1;
a[1]=znam1*znam2;
return a;
}
//нахождение НОД
public static int gcd(int a, int b)
{
if(a==0 && b==0)
return 1;
while (a != 0 && b != 0) {
if (a > b) {
if(b==0)
{
return 90904040;
}
a %= b;
} else {
if(a==0)
{
return 90904040;
}
b %= a;
}
}
return a + b;
}
}