#include <bits/stdc++.h>
#define ll long long
#define all(a) (a).begin(), (a).end()
#define dbg_line(x) cout << (x) << '\n'
#define dbg(x) cout << x << " "
using namespace std;
// <--> Report constants <-->
typedef pair<int, int> pii;
const int max_n = 1e5 + 5;
const ll inf = 1e9;
const ll m_inf = -1e9;
const ll mod = 1e9 + 7;
// <--> Report variables <-->
int n, m, k, t;
char Nurikabe[1005][1005];
int Number[1005][1005], parent[max_n], ranks[max_n];
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};
int cnt = 0;
// <--> Main Code is Here <-->
void setIO(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
void call_file(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
int findSet(int u){
if (parent[u] == u) return u;
else return parent[u] = findSet(parent[u]);
}
int toIndex(int i, int j){
return i * m + j;
}
void unionSet(int u, int v){
int pu = findSet(u);
int pv = findSet(v);
if (pu == pv) return;
if (ranks[pu] > ranks[pv]){
parent[pv] = pu;
} else
if (ranks[pv] > ranks[pu]){
parent[pu] = pv;
}
else{
ranks[pu]++;
parent[pv] = pu;
}
}
void dfs(int u, int v){
Nurikabe[u][v] = '@';
cnt++;
for (int i = 0; i < 4; i++){
int i1 = u + dx[i];
int j1 = v + dy[i];
if (i1 > 0 && i1 <= n && j1 > 0 && j1 <= m && Nurikabe[i1][j1] == '.'){
dfs(i1, j1);
}
}
}
bool solve(){
for (int i = 1; i <= n; i++){
cnt = 0;
for (int j = 1; j <= m; j++){
if (Number[i][j] != 0){
dfs(i, j);
if (cnt != Number[i][j]){
return false;
}
}
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
if (Nurikabe[i][j] == '#' && Nurikabe[i + 1][j] == '#' && Nurikabe[i][j + 1] == '#' && Nurikabe[i + 1][j + 1] == '#'){
return false;
}
}
}
int check = -1;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
if (Nurikabe[i][j] == '#'){
check = findSet(toIndex(i, j));
break;
}
}
if (check != -1) break;
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
if (Nurikabe[i][j] == '#'){
if (check != findSet(toIndex(i, j))){
return false;
}
}
}
}
return true;
}
void setup(){
for (int i = 1; i <= n * m; i++){
parent[i] = i;
ranks[i] = 1;
}
}
int main(){
setIO();
call_file();
cin >> t;
for (int s = 1; s <= t; s++){
cout << "Puzzle #" << s << ":" << " ";
cin >> n >> m >> k;
setup();
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
cin >> Nurikabe[i][j];
}
}
while(k--){
int r, c, v;
cin >> r >> c >> v;
Number[r][c] = v;
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
if (Nurikabe[i][j] == '#'){
if (j + 1 <= m && Nurikabe[i][j + 1] == '#'){
unionSet(toIndex(i, j), toIndex(i, j + 1));
}
if (i + 1 <= n && Nurikabe[i + 1][j] == '#'){
unionSet(toIndex(i, j), toIndex(i + 1, j));
}
}
}
}
if (solve()) cout << "Correct" << '\n';
else cout << "Incorrect" << '\n';
}
}