const int mod = 1e9 + 7;
const int N = 50;
ll ma[N][N];//增广矩阵
ll x[N];//解集
inline ll lcm(ll a,ll b){
return a/__gcd(a,b)*b;//先除后乘防止溢出
}
//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1
ll Gauss(ll equ,ll var)
{
int i,j,k;
int max_r;//当前这列绝对值最大的行
int col = 1;//当前处理的列
ll ta, tb, LCM, temp;
for(k = 1; k <= equ && col <= var; k++,col++){
max_r = k;
for(i = k+1;i <= equ;i++){
if(abs(ma[i][col]) > abs(ma[max_r][col])) max_r = i;
}
if(max_r!=k){
for(j = k; j <= var+1; j++) swap(ma[k][j],ma[max_r][j]);
}
if(!ma[k][col]){//说明该col列第k行一下全是0了,则处理当前行的下一列
k--;
continue;
}
for(i = k+1; i <= equ; i++){
if(ma[i][col]){
LCM = lcm(abs(ma[i][col]),abs(ma[k][col]));
ta = LCM/abs(ma[i][col]);
tb = LCM/abs(ma[k][col]);
if(ma[i][col]*ma[k][col] < 0) tb = -tb;//异号的情况是相加
for(j = col;j <= var+1;j++){
ma[i][j] = ((ma[i][j]*ta-ma[k][j]*tb)%mod+mod)%mod;
}
}
}
}
//1.无解
for(i = k; i <= equ; i++){
if(ma[i][col]!=0) return -1;
}
//2.无穷解
if(k <= var) return var-k;//自由变元有(var-k)个
//3.唯一解
for(i = var; i >= 1; i--){
temp = ma[i][var];
for(j = i+1; j <= var; j++){
if(ma[i][j]!=0) temp -= ma[i][j]*x[j];
}
//if(temp%ma[i][i] != 0) return -2; 说明有浮点数解,但无整数解.
x[i] = temp/ma[i][i];
}
return 0;
}
int main(){
int equ,var;
cin >> equ >> var;
for(int i = 1;i <= equ;i++){
for(int j = 1;j <= var+1;j++){
cin >> ma[i][j];
}
}
int op = Gauss(equ,var);
if(op == -1) printf("无解\n");
else if(op > 0) printf("无穷解,自由变元个数为%d\n",op);
else{
for(int i = 1; i <= var; i++)
cout << "x" << i << ' ' << x[i] << endl;
}
return 0;
}