/**
* ACM Training 2009
* ACM Problem #677 - All Walks of length "n" from the first node
* Link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=8&page=show_problem&problem=618
*
* @author Dennis Wilfert
* @version 1.0, 08/09/2009
*
* Status : Accepted
* Runtime: 0.404
*/

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;


public class Main {

static PrintWriter writer = new PrintWriter(new BufferedOutputStream(System.out));
static boolean walks;

public static void main(String... strings) throws IOException {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

StringTokenizer token;
int lines, length;
boolean[][] matrix;

while (true) {

token = new StringTokenizer(reader.readLine());
// Größe der Matrix
lines = Integer.parseInt(token.nextToken());
// Länge der Pfade
length = Integer.parseInt(token.nextToken());

matrix = new boolean[lines][lines];

// Matrix einlesen und als boolean-Matrix speichern
for (int i = 0; i < lines; i++) {
token = new StringTokenizer(reader.readLine());
for (int j = 0; j < lines; j++) {
matrix[i][j] = Integer.parseInt(token.nextToken()) == 1 ? true : false;
}
}
walks = false;
// Für alle true in der ersten Zeile die funktion Walks aufrufen
for (int i = 0; i < lines; i++) {
if (matrix[0][i]) {
int[] n = new int[length + 1];
n[0] = 1;
n[1] = i + 1;
Walks(matrix, n, 2);
}
}
// Ist walks false wurde kein Weg gefunden
if (!walks) {
writer.println("no walk of length " + length);
}

if(reader.readLine()==null)break;

writer.println();
}
writer.flush();

}

/*
* Wege mit der gegebenen Länge rekursiv suchen
*/
public static void Walks(boolean[][] b, int[] n, int l) {
boolean found;
// Ist l gleich der länge von n wurde eine lösung gefunden
if (n.length == l) {
writer.println(toString(n));
}
else {
for (int i = 0; i < b.length; i++) {
// Zeile des letzten wertes auf true untersuchen
if (b[n[l - 1] - 1][i]) {
found = false;
// prüfen ob der Wert bereits in n steht
for (int j = 0; j < l; j++) {
if (n[j] == i + 1) {
found = true;
}
}
// Ist found false stand der Wert bis jetzt noch nicht in n
// und kann eingetragen werden.
if (!found) {
n[l] = i + 1;
Walks(b, n, l + 1);
}

}
}
}

}
/*
* Stringausgabe des Integerarrays
*/
public static String toString(int[] a) {
walks = true;
int iMax = a.length - 1;

StringBuilder b = new StringBuilder();
b.append('(');
for (int i = 0;; i++) {
b.append(a[i]);
if (i == iMax) {
return b.append(')').toString();
}
b.append(",");
}
}
}