import java.util.*;
class Solution {
public String[] solution(int[][] line) {
List<Point> points = new ArrayList<>();
for(int i=0;i<line.length;i++){
int[] stdLine = line[i];
long stdA = (long)stdLine[0];
long stdB = (long)stdLine[1];
long stdC = (long)stdLine[2];
for(int j=i+1;j<line.length;j++){
long A = (long)line[j][0];
long B = (long)line[j][1];
long C = (long)line[j][2];
Point point = intersection(stdA, stdB, stdC, A, B, C);
if(point == null) continue;
points.add(point);
}
}
Point min = getMinimumPoint(points);
Point max = getMaximumPoint(points);
int width = (int)(max.x - min.x + 1);
int height = (int)(max.y - min.y + 1);
char[][] arr = new char[height][width];
for(char[] row : arr){
Arrays.fill(row,'.');
}
for(Point p:points){
arr[(int)(max.y - p.y)][(int)(p.x - min.x)] = '*';
}
String[] answer = new String[arr.length];
for(int i=0;i<answer.length;i++){
//answer[i] = arr[i];
answer[i] = new String(arr[i]);
}
return answer;
}
private Point getMinimumPoint(List<Point> points){
long x = Long.MAX_VALUE;
long y = Long.MAX_VALUE;
for(Point p : points){
x = Math.min(x, p.x);
y = Math.min(y, p.y);
}
return new Point(x,y);
}
private Point getMaximumPoint(List<Point> points){
long x = Long.MIN_VALUE;
long y = Long.MIN_VALUE;
for(Point p : points){
x = Math.max(x, p.x);
y = Math.max(y, p.y);
}
return new Point(x,y);
}
private Point intersection(long a1, long b1, long c1, long a2, long b2, long c2){
double x = (double)(b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
double y = (double)(a2 * c1 - a1 * c2) / (a1*b2 - a2*b1);
if(x%1 != 0 || y%1 != 0) return null;//정수판별
return new Point((long)x, (long)y);
}
private static class Point{
public final long x, y;
private Point(long x, long y){
this.x = x;
this.y = y;
}
}
}