#include<cstdio>
#include<memory.h>
using namespace std;
#define N 15
#define M 100
int sum[(1<<N)-1];
struct node{
int status;
node* next;
};
struct Patch{
int time;
char B[N];
char F[N];
}patch[M];
void addStatusNode(node* head, int _status){
node* p = head;
node* pre = p;
node* temp = NULL;
while(p != NULL && sum[p->status] < sum[_status]) {
pre = p;
p = p->next;
}
temp = new node;
temp->status = _status;
pre->next = temp;
temp->next = p;
}
int main(){
int n,m;
char s1[N],s2[N];
memset(sum,-1,sizeof(sum));
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++){
scanf("%d%s%s", &patch[i].time, &patch[i].B, &patch[i].F);
}
int max = (1<<n)-1;
node* p = new node;
p->status = max;
p->next = NULL;
sum[max] = 0;
node* head = p;
while(head != NULL){
int now = head->status;
if(now == 0){
printf("%d\n", sum[0]);
break;
}
for(int i = 0; i < m; i++){
bool flag = false;
for(int j = 0; j < n; j++)
if( patch[i].B[j]=='+' && !(now&(1<<j)) ||
patch[i].B[j]=='-' && now&(1<<j) ) {
flag = true;
break;
}
if(flag) continue;
int status = now;
for(int j = 0; j < n; j++){
if(patch[i].F[j] == '+') status |= (1<<j);
else if(patch[i].F[j] == '-') status &= (max-(1<<j));
}
if(sum[status] == -1 || sum[status] > sum[now] + patch[i].time){
sum[status] = sum[now] + patch[i].time;
addStatusNode(head, status);
}
}//end i
p = head;
head = head->next;
delete p;
} //end while
if(head == NULL)printf("0\n");
return 0;
}
#include<memory.h>
using namespace std;
#define N 15
#define M 100
int sum[(1<<N)-1];
struct node{
int status;
node* next;
};
struct Patch{
int time;
char B[N];
char F[N];
}patch[M];
void addStatusNode(node* head, int _status){
node* p = head;
node* pre = p;
node* temp = NULL;
while(p != NULL && sum[p->status] < sum[_status]) {
pre = p;
p = p->next;
}
temp = new node;
temp->status = _status;
pre->next = temp;
temp->next = p;
}
int main(){
int n,m;
char s1[N],s2[N];
memset(sum,-1,sizeof(sum));
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++){
scanf("%d%s%s", &patch[i].time, &patch[i].B, &patch[i].F);
}
int max = (1<<n)-1;
node* p = new node;
p->status = max;
p->next = NULL;
sum[max] = 0;
node* head = p;
while(head != NULL){
int now = head->status;
if(now == 0){
printf("%d\n", sum[0]);
break;
}
for(int i = 0; i < m; i++){
bool flag = false;
for(int j = 0; j < n; j++)
if( patch[i].B[j]=='+' && !(now&(1<<j)) ||
patch[i].B[j]=='-' && now&(1<<j) ) {
flag = true;
break;
}
if(flag) continue;
int status = now;
for(int j = 0; j < n; j++){
if(patch[i].F[j] == '+') status |= (1<<j);
else if(patch[i].F[j] == '-') status &= (max-(1<<j));
}
if(sum[status] == -1 || sum[status] > sum[now] + patch[i].time){
sum[status] = sum[now] + patch[i].time;
addStatusNode(head, status);
}
}//end i
p = head;
head = head->next;
delete p;
} //end while
if(head == NULL)printf("0\n");
return 0;
}