#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = (1<<21)-1;
int dis[MAXN],n,m,vis[MAXN];
char c;
struct node {
int t,b1,b2,f1,f2;
}e[122];
struct E{
int pos,w;
friend bool operator<(E a,E b){
return a.w<b.w;
}
}tmp;
priority_queue<E>q;
void dijk(){
memset(dis,0x3f,sizeof(dis));
tmp.pos=0,tmp.w=0;
dis[0]=0;
q.push(tmp);
while(!q.empty()){
int now=q.top().pos;
q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=1;i<=n;i++){
if((now&e[i].b2)==e[i].b2&&(now&e[i].b1)==0){
int next_pos=(now|e[i].f1)^e[i].f2;
if(dis[next_pos]>dis[now]+e[i].t){
dis[next_pos]=dis[now]+e[i].t;
}
tmp.pos=next_pos,tmp.w=dis[next_pos];
q.push(tmp);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>e[i].t;
for(int j=1;j<=n;j++){
cin>>c;
if(c=='+')e[i].b1+=1;
if(c=='-')e[i].b2+=1;
e[i].b1<<=1;
e[i].b2<<=1;
}
for(int j=1;j<=n;j++){
cin>>c;
if(c=='+')e[i].f1+=1;
if(c=='-')e[i].f2+=1;
e[i].f1<<=1;
e[i].f2<<=1;
}
}
dijk();
if(dis[(1<<n)-1]==1061109567)cout<<0;
else cout<<dis[(1<<n)-1];
cout<<dis[1];
return 0;
}