import java.util.ArrayList;

public class WordSSolver {

	public static void main(String[] args) {
		String file = null;
		boolean timing = false;
		for (int i = 0; i < args.length; i++) {
			switch (args[i]) {
				case "-timing":
					timing = true;
					continue;
				default:
					file = args[i];
					continue;
			}
		}
		double startTime = System.currentTimeMillis();

		Sopa sopa = new Sopa(file);
		ArrayList<String> words = sopa.getWords();

		ArrayList<word> found_words = new ArrayList<word>();

		ArrayList<String> horz = sopa.getHorizontals();
		ArrayList<String> horz_r = sopa.reverse(horz);

		ArrayList<String> vert = sopa.getVerticals();
		ArrayList<String> vert_r = sopa.reverse(vert);

		ArrayList<String> diag_ur = sopa.getDiagonal_UR();
		ArrayList<String> diag_ul = sopa.getDiagonal_UL();

		ArrayList<String> diag_dl = sopa.reverse(diag_ur);
		ArrayList<String> diag_dr = sopa.reverse(diag_ul);
		
		loop: for (String word : words) {
			for (String s : horz) {
				if (s.contains(word)) {
					int col = s.indexOf(word) + 1;
					int row = horz.indexOf(s) + 1;
					found_words.add(new word(word, word.length(), row, col, "right"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : vert) {

				if (s.contains(word)) {
					int row = s.indexOf(word) + 1;
					int col = vert.indexOf(s) + 1;
					found_words.add(new word(word, word.length(), row, col, "down"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : horz_r) {
				if (s.contains(word)) {
					int col = sopa.getSize() - (s.indexOf(word));
					int row = horz_r.indexOf(s) + 1;
					found_words.add(new Word(word, word.length(), row, col, "left"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : vert_r) {

				if (s.contains(word)) {
					int row = sopa.getSize() - s.indexOf(word);
					int col = vert_r.indexOf(s) + 1;
					found_words.add(new word(word, word.length(), row, col, "up"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : diag_dr) {
				if (s.contains(word)) {
					int idx = diag_dr.indexOf(s) + 1; 
					int drow = idx > sopa.getSize() ? idx - sopa.getSize() + 1 : 1; 
					int dcol = idx > sopa.getSize() ? 1 : sopa.getSize() - idx + 1; 
					int row = drow + s.indexOf(word);
					int col = dcol + s.indexOf(word); 
					found_words.add(new word(word, word.length(), row, col, "downright"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : diag_dl) {
				if (s.contains(word)) {
					int idx = diag_dl.indexOf(s) + 1; 
					int drow = idx > sopa.getSize() ? idx - sopa.getSize() + 1 : 1; 
					int dcol = idx > sopa.getSize() ? sopa.getSize() : idx; 
					int row = drow + s.indexOf(word);
					int col = dcol - s.indexOf(word); 
					found_words.add(new word(word, word.length(), row, col, "downleft"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : diag_ul) {
				if (s.contains(word)) {
					int idx = diag_ul.indexOf(s) + 1; 
					int drow = idx > sopa.getSize() ? sopa.getSize() : idx; 
					int dcol = idx > sopa.getSize() ? (2 * sopa.getSize()) - idx : sopa.getSize();

					int row = drow - s.indexOf(word);
					int col = dcol - s.indexOf(word); 
					found_words.add(new word(word, word.length(), row, col, "upleft"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
			for (String s : diag_ur) {
				if (s.contains(word)) {
					int idx = diag_ur.indexOf(s) + 1; 
					int drow = idx > sopa.getSize() ? sopa.getSize() : idx;
					int dcol = idx > sopa.getSize() ? idx - sopa.getSize() + 1 : 1;
					int row = drow - s.indexOf(word);
					int col = dcol + s.indexOf(word); 
					found_words.add(new word(word, word.length(), row, col, "upright"));
					if (!isPalindrome(word))
						continue loop;
				}
			}
		}

		for (Word w : found_words) {
			System.out.println(w);
		}

	}

	public static boolean isPalindrome(String word) {
		return word.equals(new StringBuilder(word).reverse().toString());
	}
}