diff --git a/libs/grafo.c b/libs/grafo.c
index 07774beb7f5120b1d4815b6333ef0a4b058f64f7..d3f4729f4290f60b88989523c0bfcaa669049320 100644
--- a/libs/grafo.c
+++ b/libs/grafo.c
@@ -19,8 +19,8 @@ Vertice insereVertice(Grafo g, Vertice v) {
 }
 
 void criaArco(Vertice v, Vertice w) {
-    insereLista(w, v->filhos);
-    insereLista(v, w->pais);
+    insereUnicoLista(w, v->filhos);
+    insereUnicoLista(v, w->pais);
 }
 
 void tabuleiroParaGrafo(Tblr t, Grafo g) {
diff --git a/libs/lista.c b/libs/lista.c
index d6cfac5e0cd12d641681f5fe0e502c853d78f10e..5362d1f4c6b7120ae2fb70f6d866051b9fce5684 100644
--- a/libs/lista.c
+++ b/libs/lista.c
@@ -8,7 +8,7 @@ struct Lista {
 
     unsigned int tamanho;
     int padding; // só pra evitar warning
-    No primeiro;
+    No primeiro, ultimo;
 };
 //---------------------------------------------------------------------------
 // devolve o número de nós da Lista l
@@ -34,6 +34,7 @@ Lista constroiLista(void) {
     return NULL;
 
     l->primeiro = NULL;
+    l->ultimo = NULL;
     l->tamanho = 0;
 
     return l;
@@ -76,6 +77,31 @@ int destroiLista(Lista l, int destroi(void *)) {
 //      ou NULL em caso de falha
 
 No insereLista(void *conteudo, Lista l) {
+    No novo = criaNo();
+
+    if ( ! novo )
+    return NULL;
+
+    setConteudo(novo, conteudo);
+    ++l->tamanho;
+    if(l->tamanho == 1) {
+        l->primeiro = novo;
+    }
+    if(l->ultimo) {
+        setSucessorNo(l->ultimo, novo);
+    }
+    l->ultimo = novo;
+
+    return novo;
+}
+
+//---------------------------------------------------------------------------
+// insere um novo nó na Lista l cujo conteúdo é p
+//
+// devolve o No recém-criado
+//      ou NULL em caso de falha
+
+No insereUnicoLista(void *conteudo, Lista l) {
     // Não insere se já estiver na lista
     for(No n = primeiroNoLista(l); n; n = getSucessorNo(n)) {
         if(getConteudo(n) == conteudo) {
@@ -88,10 +114,16 @@ No insereLista(void *conteudo, Lista l) {
     return NULL;
 
     setConteudo(novo, conteudo);
-    setSucessorNo(novo, primeiroNoLista(l));
     ++l->tamanho;
+    if(l->tamanho == 1) {
+        l->primeiro = novo;
+    }
+    if(l->ultimo) {
+        setSucessorNo(l->ultimo, novo);
+    }
+    l->ultimo = novo;
 
-    return l->primeiro = novo;
+    return novo;
 }
 
 //------------------------------------------------------------------------------
diff --git a/libs/lista.h b/libs/lista.h
index 2056e1a479b4a6d520db14cfb45e7fde4b0b60c6..43179ca736f1636465fe4bd8531ba9fe65256099 100644
--- a/libs/lista.h
+++ b/libs/lista.h
@@ -25,6 +25,15 @@ No primeiroNoLista(Lista l);
 //      ou NULL em caso de falha
 
 No insereLista(void *conteudo, Lista l);
+
+//------------------------------------------------------------------------------
+// insere um Novo nó na Lista l cujo conteúdo é p se p não estiver na lista
+//
+// devolve o No recém-criado
+//      ou NULL em caso de falha
+
+No insereUnicoLista(void *conteudo, Lista l);
+
 //------------------------------------------------------------------------------
 // cria uma Lista vazia e a devolve
 //
diff --git a/libs/vertice.c b/libs/vertice.c
index 105720b7556fba641fa22fe647f3d6102d5982d9..019059d7dd5c86fc334657f61a6a7c18b43c1232 100644
--- a/libs/vertice.c
+++ b/libs/vertice.c
@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <stdbool.h>
 #include "vertice.h"
 #include "lista.h"
 
@@ -7,6 +8,7 @@ Vertice criaVertice() {
 
     v->cor = -1;
     v->peso = 0;
+    v->grupo = false;
     v->pais = constroiLista();
     v->filhos = constroiLista();
     return v;
diff --git a/libs/vertice.h b/libs/vertice.h
index c707a56bb3f80a95aac2f6c1a2644e0e201aac1b..3b509c7c27f84ce0ef68e7196ceab5c2aa46e63b 100644
--- a/libs/vertice.h
+++ b/libs/vertice.h
@@ -1,10 +1,12 @@
 #ifndef _VERTICE_
 #define _VERTICE_
 #include "lista.h"
+#include <stdbool.h>
 
 struct Vertice {
     int cor;
     int peso;
+    bool grupo;
     Lista pais;
     Lista filhos;
 };
diff --git a/main.c b/main.c
index 7b9e482c65708e06c77f6158c38b19f49f06d57b..c9b43ff5e4a8e2717e6de40f4729421995c5a27c 100644
--- a/main.c
+++ b/main.c
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <stdbool.h>
 #include <time.h>
 #include "libs/tabuleiro.h"
 #include "libs/no.h"
@@ -20,11 +21,17 @@ int main() {
     // Lista com o grupo inicial
     Lista grupo = constroiLista();
     insereLista(t->celulas[0]->vert, grupo); // A célula na posição 0 do array é a célula no canto superior esquerdo
+    t->celulas[0]->vert->grupo = true;
 
-    // Desaloca lista do grupo
-    destroiLista(grupo, NULL);
     // Desaloca tabuleiro
     destroiTblr(t);
+
+    // printf("Número de grupos: %d\n", tamanhoLista(g->vertices));
+    Lista jogadas = constroiLista();
+
+    destroiLista(jogadas, NULL);
+    // Desaloca lista do grupo
+    destroiLista(grupo, NULL);
     // Desaloca grafo
     destroiGrafo(g);
     return 0;
diff --git a/tests/runTests.sh b/tests/runTests.sh
index 9cb373fe90bba13eaa118aff73cf0966172b60c2..26e5f3436408fdcbe4d90c40bbd3acd70e828dae 100755
--- a/tests/runTests.sh
+++ b/tests/runTests.sh
@@ -7,7 +7,7 @@ tempo_max=10000 #10s
 tams=(4 8 16 25 32 50 64 75 100 128)
 
 # lista de cores
-cores=(2 3 4 5 6 7 8 16 32)
+cores=(2 3 4 5 6 7 8 10)
 
 #-- Cores do terminal
 RED='\033[0;31m'