#include <bits/stdc++.h>
using namespace std;
char buf[10099];
pair<char, char> s[18][18];
char num[] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
char suit[] = {'C', 'D', 'H', 'S'};
int abs(int x) { return x > 0 ? x : -x; }
bool gao(int x, int y, pair<char, char> s[][18]) {
  set<char> num, suit;
  for (int i = x; i < x + 3; ++i) {
    for (int j = y; j < y + 3; ++j) {
      num.insert(s[i][j].first);
      suit.insert(s[i][j].second);
    }
  }
  return (int)num.size() == 9 || (int)suit.size() == 1;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  pair<int, int> J1(-1, -1), J2(-1, -1);
  set<pair<char, char> > rest;
  for (int i = 0; i < 13; ++i) {
    for (int j = 0; j < 4; ++j) {
      rest.insert(make_pair(num[i], suit[j]));
    }
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      scanf(" %c%c", &s[i][j].first, &s[i][j].second);
      if (s[i][j].first == 'J' &&
          (s[i][j].second == '1' || s[i][j].second == '2')) {
        if (s[i][j].second == '1') {
          J1.first = i;
          J1.second = j;
        } else {
          J2.first = i;
          J2.second = j;
        }
      } else {
        rest.erase(s[i][j]);
      }
    }
  }
  if (J1.first != -1 || J2.first != -1) {
    if (J1.first == -1 || J2.first == -1) {
      int jd;
      if (J1.first != -1) {
        jd = 1;
      } else {
        jd = 2;
        J1 = J2;
      }
      for (set<pair<char, char> >::iterator si = rest.begin(); si != rest.end();
           ++si) {
        pair<char, char> card = *si;
        s[J1.first][J1.second] = card;
        vector<pair<int, int> > ans;
        for (int i = 0; i < n - 2; ++i) {
          for (int j = 0; j < m - 2; ++j) {
            if (gao(i, j, s)) {
              ans.push_back(make_pair(i, j));
            }
          }
        }
        for (int i = 0; i < ans.size(); ++i) {
          for (int j = i + 1; j < ans.size(); ++j) {
            if (abs(ans[i].first - ans[j].first) >= 3 ||
                abs(ans[i].second - ans[j].second) >= 3) {
              printf("Solution exists.\n");
              printf("Replace J%d with %c%c.\n", jd, card.first, card.second);
              printf("Put the first square to (%d, %d).\n", ans[i].first + 1,
                     ans[i].second + 1);
              printf("Put the second square to (%d, %d).\n", ans[j].first + 1,
                     ans[j].second + 1);
              return 0;
            }
          }
        }
      }
    } else {
      for (set<pair<char, char> >::iterator si = rest.begin(); si != rest.end();
           ++si) {
        pair<char, char> card = *si;
        s[J1.first][J1.second] = card;
        for (set<pair<char, char> >::iterator sj = rest.begin();
             sj != rest.end(); ++sj) {
          if (sj == si) {
            continue;
          }
          s[J2.first][J2.second] = *sj;
          vector<pair<int, int> > ans;
          for (int i = 0; i <= n - 3; ++i) {
            for (int j = 0; j <= m - 3; ++j) {
              if (gao(i, j, s)) {
                ans.push_back(make_pair(i, j));
              }
            }
          }
          for (int i = 0; i < ans.size(); ++i) {
            for (int j = i + 1; j < ans.size(); ++j) {
              if (abs(ans[i].first - ans[j].first) >= 3 ||
                  abs(ans[i].second - ans[j].second) >= 3) {
                printf("Solution exists.\n");
                printf("Replace J1 with %c%c and J2 with %c%c.\n", card.first,
                       card.second, sj->first, sj->second);
                printf("Put the first square to (%d, %d).\n", ans[i].first + 1,
                       ans[i].second + 1);
                printf("Put the second square to (%d, %d).\n", ans[j].first + 1,
                       ans[j].second + 1);
                return 0;
              }
            }
          }
        }
      }
    }
  } else {
    vector<pair<int, int> > ans;
    for (int i = 0; i <= n - 3; ++i) {
      for (int j = 0; j <= m - 3; ++j) {
        if (gao(i, j, s)) {
          ans.push_back(make_pair(i, j));
        }
      }
    }
    for (int i = 0; i < ans.size(); ++i) {
      for (int j = i + 1; j < ans.size(); ++j) {
        if (abs(ans[i].first - ans[j].first) >= 3 ||
            abs(ans[i].second - ans[j].second) >= 3) {
          printf("Solution exists.\n");
          printf("There are no jokers.\n");
          printf("Put the first square to (%d, %d).\n", ans[i].first + 1,
                 ans[i].second + 1);
          printf("Put the second square to (%d, %d).\n", ans[j].first + 1,
                 ans[j].second + 1);
          return 0;
        }
      }
    }
  }
  puts("No solution.");
  return 0;
}
