#include<bits/stdc++.h>
using namespace std;
#define MAX_V 500
#define INF 1<<28
typedef pair<int,int> P;
struct edge{
  int to,cap,cost,rev;
  edge(){}
  edge(int to,int cap,int cost,int rev):to(to),cap(cap),cost(cost),rev(rev){}
};

int V;
vector<edge> G[MAX_V];
int h[MAX_V];
int dist[MAX_V];
int prevv[MAX_V],preve[MAX_V];

void add_edge(int from,int to,int cap,int cost){
  G[from].push_back(edge(to,cap,cost,G[to].size()));
  G[to].push_back(edge(from,0,-cost,G[from].size()-1));
}

int min_cost_flow(int s,int t,int f){
  int res=0;
  fill(h,h+V,0);
  while(f>0){
    priority_queue<P,vector<P>,greater<P> > que;
    fill(dist,dist+V,INF);
    dist[s]=0;
    que.push(P(0,s));
    while(!que.empty()){
      P p=que.top();que.pop();
      int v=p.second;
      if(dist[v]<p.first) continue;
      for(int i=0;i<(int)G[v].size();i++){
	edge &e=G[v][i];
	if(e.cap>0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){
	  dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];
	  prevv[e.to]=v;
	  preve[e.to]=i;
	  que.push(P(dist[e.to],e.to));
	}
      }
    }
    if(dist[t]==INF){
      return -1;
    }
    for(int v=0;v<V;v++) h[v]+=dist[v];

    int d=f;
    for(int v=t;v!=s;v=prevv[v]){
      d=min(d,G[prevv[v]][preve[v]].cap);
    }
    f-=d;
    res+=d*h[t];
    for(int v=t;v!=s;v=prevv[v]){
      edge &e=G[prevv[v]][preve[v]];
      e.cap-=d;
      G[v][e.rev].cap+=d;
    }
  }
  return res;
}

struct ope{
  int x,y,d;
  ope(){}
  ope(int x,int y,int d):x(x),y(y),d(d){}
};

int main(){
  int n;
  cin>>n;
  int c[2][n][n];
  for(int k=0;k<2;k++)
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
	cin>>c[k][i][j];
  
  string str[n];
  for(int i=0;i<n;i++) cin>>str[i];

  V=n*2+2;
  int s=n*2,t=n*2+1;
  for(int i=0;i<n;i++){
    add_edge(s,i,1,0);
    add_edge(n+i,t,1,0);
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      int r=0;
      for(int k=0;k<n;k++){
	if(k==j){
	  if(str[i][k]=='.') r+=c[0][i][k];
	}else{
	  if(str[i][k]=='o') r+=c[1][i][k];
	}
      }
      add_edge(i,n+j,1,r);
    }
  }
  cout<<min_cost_flow(s,t,n)<<endl;
  vector<ope> v;
  for(int i=0;i<n;i++){
    for(int j=0;j<(int)G[i].size();j++){
      if(G[i][j].cap) continue;
      for(int k=0;k<n;k++){
	if(n+k==G[i][j].to){
	  if(str[i][k]=='.') v.push_back(ope(i+1,k+1,0));
	}else{
	  if(str[i][k]=='o') v.push_back(ope(i+1,k+1,1));
	}
      }
    }
  }
  cout<<v.size()<<endl;
  for(int i=0;i<(int)v.size();i++)
    cout<<v[i].x<<" "<<v[i].y<<" "<<(v[i].d?"erase":"write")<<endl;
  return 0;
}