#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct Vector
{
    double x;
    double y;
    double z;
} Vector;

typedef struct Mesh
{
    int a;
    int b;
    int c;
} Mesh;

typedef struct Figure
{
    int numPoints;
    Vector *points;
    int numMeshes;
    Mesh *meshes;
    int **boundary;
} Figure;

Vector subtract(Vector v1, Vector v2)
{
    Vector v = {v1.x - v2.x, v1.y - v2.y, v1.z - v2.z};
    return v;
}

double dot(Vector v1, Vector v2)
{
    double result = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
    return result;
}

Vector cross(Vector v1, Vector v2)
{
    Vector v;
    v.x = v1.y * v2.z - v1.z * v2.y;
    v.y = v1.z * v2.x - v1.x * v2.z;
    v.z = v1.x * v2.y - v1.y * v2.x;
    return v;
}

void setBoundary(Figure *figure)
{
    figure->boundary = malloc(sizeof(int *) * figure->numPoints);
    for (int i = 0; i < figure->numPoints; i++)
    {
        figure->boundary[i] = calloc(figure->numPoints, sizeof(int));
    }
    for (int i = 0; i < figure->numMeshes; i++)
    {
        int a = figure->meshes[i].a;
        int b = figure->meshes[i].b;
        int c = figure->meshes[i].c;
        figure->boundary[a][b]++;
        figure->boundary[b][c]++;
        figure->boundary[c][a]++;
    }
}

Figure *makeFigure()
{
    Figure *figure = malloc(sizeof(Figure));
    scanf("%d", &figure->numPoints);
    getchar();
    figure->points = malloc(sizeof(Vector) * figure->numPoints);
    for (int i = 0; i < figure->numPoints; i++)
    {
        scanf("(%lf, %lf, %lf)", &figure->points[i].x, &figure->points[i].y, &figure->points[i].z);
        getchar();
    }
    scanf("%d", &figure->numMeshes);
    getchar();
    figure->meshes = malloc(sizeof(Mesh) * figure->numMeshes);
    for (int i = 0; i < figure->numMeshes; i++)
    {
        scanf("(%d, %d, %d)", &figure->meshes[i].a, &figure->meshes[i].b, &figure->meshes[i].c);
        getchar();
    }
    setBoundary(figure);
    return figure;
}

void freeFigure(Figure *figure)
{
    free(figure->points);
    free(figure->meshes);
    for (int i = 0; i < figure->numPoints; i++)
    {
        free(figure->boundary[i]);
    }
    free(figure->boundary);
    free(figure);
}

int isOriented(Figure *figure)
{
    for (int i = 0; i < figure->numPoints; i++)
    {
        for (int j = 0; j < figure->numPoints; j++)
        {
            if (figure->boundary[i][j] >= 2)
            {
                return 0;
            }
        }
    }
    return 1;
}

int isClosed(Figure *figure)
{
    if (!isOriented(figure))
    {
        return 0;
    }
    else
    {
        for (int i = 0; i < figure->numPoints; i++)
        {
            for (int j = 0; j < figure->numPoints; j++)
            {
                if (figure->boundary[i][j] && !figure->boundary[j][i])
                {
                    return 0;
                }
            }
        }
        return 1;
    }
}

double calculateArea(Figure *figure)
{
    double area = 0.0;
    for (int i = 0; i < figure->numMeshes; i++)
    {
        Vector v1 = subtract(figure->points[figure->meshes[i].b], figure->points[figure->meshes[i].a]);
        Vector v2 = subtract(figure->points[figure->meshes[i].c], figure->points[figure->meshes[i].a]);
        Vector v = cross(v1, v2);
        area += sqrt(dot(v, v)) / 2;
    }
    return area;
}

double calculatePerimeter(Figure *figure)
{
    double perimeter = 0.0;
    for (int i = 0; i < figure->numPoints; i++)
    {
        for (int j = 0; j < figure->numPoints; j++)
        {
            if (figure->boundary[i][j] == 1 && figure->boundary[j][i] != 1)
            {
                Vector v = subtract(figure->points[i], figure->points[j]);
                perimeter += sqrt(dot(v, v));
            }
        }
    }
    return perimeter;
}

double calculateVolume(Figure *figure)
{
    double volume = 0.0;
    for (int i = 0; i < figure->numMeshes; i++)
    {
        Vector v1 = figure->points[figure->meshes[i].a];
        Vector v2 = figure->points[figure->meshes[i].b];
        Vector v3 = figure->points[figure->meshes[i].c];
        volume += dot(v1, cross(v2, v3)) / 6;
    }
    if (volume < 0)
    {
        volume = -volume;
    }
    return volume;
}

void printDetails(Figure *figure)
{
    if (isOriented(figure))
    {
        if (isClosed(figure))
        {
            printf("closed and oriented\n");
            printf("volume : %lf\n", calculateVolume(figure));
            printf("area   : %lf\n", calculateArea(figure));
            return;
        }
        else
        {
            printf("oriented\n");
        }
    }
    else
    {
        printf("unoriented\n");
    }
    printf("area     : %lf\n", calculateArea(figure));
    printf("perimeter: %lf\n", calculatePerimeter(figure));
}

int main()
{
    Figure *figure = makeFigure();
    printDetails(figure);
    freeFigure(figure);
    return 0;
}