/*
 Michael Scott, November 2001
 */

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

class point {
    public int x;
    public int y;

    point(int X, int Y) {
        x = X;  y = Y;
    }
}

class edge {
    public int a;
    public int b;

    edge(int A, int B) {
        a = A;  b = B;
    }
}

public class DisplayGraph extends JApplet {
    private final int width = 500;
    private final int height = 500;
    private final int border = 10;
    private final int dotsize = 6;
    private point points[];
    private edge edges[];
    private int n = 0;  // number of points
    private int m = 0;  // number of edges
    private int minx = Integer.MAX_VALUE;
    private int miny = Integer.MAX_VALUE;
    private int maxx = 0;
    private int maxy = 0;

    private void die(String s) {
        System.err.println(s);
        System.exit(1);
    }

    public void init() {
        setBackground(Color.white);
        setForeground(Color.black);

        StreamTokenizer in = new StreamTokenizer(
            new BufferedReader(new InputStreamReader(System.in)));
        try {
            // read number of points, edges
            if (in.nextToken() != in.TT_NUMBER)
                die("Missing number of points");
            n = (int) in.nval;
            if (in.nextToken() != in.TT_NUMBER)
                die("Missing number of edges");
            m = (int) in.nval;

            points = new point[n];
            edges = new edge[m];

            // read points themselves
            for (int i = 0; i < n; i++) {
                if (in.nextToken() != in.TT_NUMBER)
                    die("Missing X value #" + String.valueOf(i));
                final int X = (int) in.nval;
                if (in.nextToken() != in.TT_NUMBER)
                    die("Missing Y value #" + String.valueOf(i));
                final int Y = (int) in.nval;
                points[i] = new point(X, Y);
                if (X < minx) minx = X;
                if (Y < miny) miny = Y;
                if (X > maxx) maxx = X;
                if (Y > maxy) maxy = Y;
            }

            // read edges
            for (int i = 0; i < m; i++) {
                if (in.nextToken() != in.TT_NUMBER)
                    die("Missing edge tail #" + String.valueOf(i));
                final int A = (int) in.nval;
                if (A >= n)
                    die("Edge tail #" + String.valueOf(i) + " out of bounds");
                if (in.nextToken() != in.TT_NUMBER)
                    die("Missing edge head #" + String.valueOf(i));
                final int B = (int) in.nval;
                if (B >= n)
                    die("Edge head #" + String.valueOf(i) + " out of bounds");
                edges[i] = new edge(A, B);
            }
        } catch (IOException e) {
            die(e.toString());
        }
    }

    private int xCoord(int x) {
        return (x-minx)*width/(maxx-minx)+border;
    }
    private int yCoord(int y) {
        return (y-miny)*height/(maxy-miny)+border;
    }

    private void putPoint(Graphics2D g, point p) {
        g.setPaint(Color.blue);
        g.fillOval(xCoord(p.x)-dotsize/2,
                   yCoord(p.y)-dotsize/2,
                   dotsize, dotsize);
    }

    private void putEdge(Graphics2D g, edge e) {
        g.setPaint(Color.black);
        g.draw(new Line2D.Double(
            xCoord(points[e.a].x),
            yCoord(points[e.a].y),
            xCoord(points[e.b].x),
            yCoord(points[e.b].y)));
    }

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

        for (int i = 0; i < n; i++) {
            putPoint(g2, points[i]);
        }
        for (int i = 0; i < m; i++) {
            putEdge(g2, edges[i]);
        }
    }

    public static void main(String args[]) {
        final DisplayGraph me = new DisplayGraph();
        me.init();
        JFrame f = new JFrame("Displaying Graph");
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        });
        f.getContentPane().add("Center", me);
        f.pack();
        f.setSize(new Dimension(530, 550));
        f.show();
        f.repaint();
    }
}
